第八章:react新语法

以下的新语法,都是固定的用法,不涉及原理性的东西,老师也讲的很快很简略,记住基本用法就行了,等真正做项目的时候可以仔细看文档。其实新语法还有很多老师没有讲,文档是一定要看的。

1. setState

注意:setState是用在类组件里面的,函数式组件里面使用useState()了。

1、对象式的setState

一般我们使用的是对像式的写法,同时省略了第二个参数。setState函数本身是同步的函数,但是react底层的渲染更新是异步的。下面是证明:

注意看:页面结果更新为1,但是第10行的输出是0。说明react渲染过程是异步的。

对象式setState的第二个参数写一个箭头函数,可以输出结果看一下:

2、函数式的setState

总结:setState更新状态的2种写法

2. lazyLoad

路由组件的lazyLoad

示例:

将浏览器的disable cache勾选上,然后选择慢速网络,就可以看到效果了。

3. Hooks

如果想更多的了解hooks的用法,可以查看阮一峰的文章:https://www.ruanyifeng.com/blog/2019/09/react-hooks.htmlhttps://www.ruanyifeng.com/blog/2020/09/react-hooks-useeffect-tutorial.html

1. React Hook/Hooks是什么?

2. 三个常用的Hook

3. State Hook

说实话,用起来也蛮好用的,但是定义多个变量,要一个一个定义,不知道一个复杂组件里面能不能定义一个复杂对象,对象的监听会不会有问题,这些都要等实际操作的时候才能知道。

 

4. Effect Hook

需求:让结果每隔1秒+1,显示出来。

分析:在类组件中可以使用生命周期钩子componentDidMount()和componentWillUnmount()来处理相关逻辑,那函数式组件里面没有生命周期钩子,怎么办呢?就要使用useEffect()来执行副作用操作(相当于模拟类组件中的生命周期钩子,总结中说明了useEffect()相当于三种生命周期的组合,那如果我要用别的生命周期钩子,该怎么办呢?可能原因就是react设计者们认为别的生命周期钩子没有什么作用了,或者说用别的hooks可以达到目的,到时候如果我遇到了问题,再搜索答案吧)。

5. Ref Hook

4. Fragment

使用

作用

1、可以不用必须有一个真实的DOM根标签了。原来无论是类组件还是函数式组件,暴露出去的标签必须只有一个根节点,一般写成div,这个div也真实地渲染在html中,但是这些标签没有实际的意义,那么就可以使用Fragment了。

2、一般情况下写 Fragment 或 <> 都是可以的,但是 <> 不能指定任意属性,就只能这样写 <></>。而Fragment可以指定一个key属性(只能指定key属性,指定别的属性会报错),用于循环渲染的情况:<Fragment key={item.id}></Fragment>

3、如果使用Fragment,必须先引入import {Fragment} from "react"。但使用<></>不需要引入,直接使用。

5. Context

理解

一种组件间通信方式,常用于【祖组件】与【后代组件】间通信。

一般用于【祖组件】和【孙组件】或更低层级的后代组件间的通信,因为父子组件传值使用props是最简单的。

使用

注意

显示效果:

image-20230819165728101

6. 组件优化

Component的2个问题

这里的Component指的是import {Component} from "react"这个Component。

  1. 只要执行setState(),即使不改变状态数据( this.setState({}) ),组件也会重新render() ==> 效率低
  2. 只当前组件重新render(), 就会自动重新render子组件,纵使子组件没有用到父组件的任何数据 ==> 效率低

效率高的做法

只有当组件的state或props数据发生改变时才重新render()

原因

Component中的生命周期函数shouldComponentUpdate()总是返回true

解决

react中数据的更新,都要产生新的数据,不要在原有数据上进行修改,这是很重要的一点。

7. render props

如何向组件内部动态传入带内容的结构(标签)?

上面这段话是什么意思?上面这段话很突兀,因为这是老师对问题的总结。但是真正的问题是什么?是想把组件写在一起形成层级关系,然后传递组件的状态给下级组件。

比如说:下面的这段代码,是一直学到现在都在使用的标签编写方式,在一个组件里面写另一个组件的标签,就会形成组件之间的父子关系。

但是如果写成这样,可以吗?

显示效果:

image-20230819194639740

并不现实B组件的内容。为什么呢?因为标签体的内容是放在子组件的 this.props.children 上面的(在讲NavLink的时候有讲到),要展示出来才行。

image-20230819193057177

image-20230819194917856

那么加个需求,这种方式怎么将A里面的状态传递给B呢?因为A组件的定义里面根本没有B标签,无法通过标签属性传递数据。需要写成这样:<A render={(data) => <B data={data}></B>}></A>

显示:

image-20230819195955367

这样做的好处在哪里?可以把render={}里面的组件改成任意需要A状态的组件,就相当于Vue里面的插槽技术。这个技术非常好用,一定要会。

children props

render props

 

8. 错误边界

理解:

错误边界(Error boundary):用来捕获后代组件错误,渲染出备用页面。

这种方法只适用于“生产环境”,“开发环境”会执行一下错误边界,但接着会显示报错信息。目的是让开发者知道错误的信息。

特点:

只能捕获后代组件生命周期产生的错误,不能捕获自己组件产生的错误和其他组件在合成事件、定时器中产生的错误

使用方式:

在使用子组件的父组件里面,使用生命周期函数 getDerivedStateFromError(),同时配合使用生命周期函数`componentDidCatch()

案例:

开发环境下显示效果:

报错信息是这样的,其实报错信息可以在控制台看到。

image-20230819203542757

生产环境下是这样的,用serve库。没有报错信息,给用户很好的体验。

9. 组件通信方式总结

组件间的关系:

几种通信方式:

比较好的搭配方式:

 

总结:

课程虽然学习完成了,但远远不够,因为我偶然间打开material-ui库看了一下,发现其中很多写法我还是不会的,说明很多东西还是要继续学习的,所以我为自己安排一下后续的学习过程:

1、先跟着做一个react项目,把一些项目基本点给搞清楚。

2、学习material-ui和antd库,把用法搞清楚就行了,有时间可以看一下别人写的源码,真的可以借鉴他们的写法。

3、学习单元测试,学习写文档,学习写英文注释。

4、学习react的API,把一些常见的api要用熟,并且能够解释给别人听。

5、其中穿插着可以看react设计原理和vue设计原理,我觉得差不多可以看了。

6、这个老师讲得蛮好的,抽空看一下他讲的vue3课程,如果没时间,一定要看vue-router和vuex或者pinia,这些概念其实我还很混沌。

7、觉得想学react-native了,就直接学,当然首先要把react知识全部过一遍。

学习过程中收集的一些问题:

为什么新版本的react全面推进hooks?

可以看知乎这个问答https://www.zhihu.com/question/343314784,原因肯定是之前的class类组件使用上有些不便的地方,所以要改成这样。但是什么样的不便,我是没有经验的。

我对于这个问题的经验就是:尚硅谷这门课的老师主要讲的是class创建组件,函数创建组件只是一笔带过,但是我必须什么都要会用,因为一个公司中不会一直都是最新的技术,有项目会新写、但有项目总是要进行维护的,最新技术的引入总有一个过程,在面试的时候我就可以将新旧知识都讲一下,这样就会把我的知识都体现出来。如果方法实在太多、记不起来,也要能够查找资料来使用,不至于被卡住。总之就是别人会的我也会,别人不会的我照样会,这样才有竞争力。

如何考察候选人的react技术水平?

可以参考知乎的这个问答https://www.zhihu.com/question/60548673,如果是大企业,最大的可能性是现场写一个小项目,比如说todolist,别人可以从中看出很多东西,我个人认为这种方式我目前是没有办法准备好的,因为没有好的习惯,也没有例子可以参照,但是呢如果有机会,就大胆上,别人可以给我提意见,我就可以改进。如果是中小企业,大概就是考察知识点,知识点需要搜索一下,最好有答案的那种。这个答案看起来不错。

image-20230407112801297

react相比于vue其实是难一些的

react的核心语法其实比vue要少,但是这是建立在很多功能需要第三方库提供的前提下的,其实语法的数量都差不多。其次就是react的编写思想需要特别注意,因为数据是单向流动的,所以很多地方不方便。最后就是JS的功底,如果JS功底差,就根本看不懂别人的写法,更不用说自己写了。

不过这也是一个好处,正因为难,所以会的人不多,会的人不多,人的单价就高一些,那我学会react就更有价值。否则就是什么都会,一顿操作猛如虎,一看工资2500,有什么用呢?

但是这个转变是很有难度的,所以才会有很多知乎提问:为什么有vue了,还会有react?https://www.zhihu.com/question/472143922/answer/2227673336https://www.zhihu.com/question/356637220/answer/2288975075https://www.zhihu.com/question/270380742/answer/2925270944

我现阶段也是不习惯,有一个回答我觉得很好,这里贴出来。可以找一些更适合用react写的项目来学习,这样会快一些。

image-20230407133427158