React学习边角料-针对框架的优化方案

176 阅读2分钟

1.减少不必要的渲染

a.shouldComponentUpdate

shouldComponentUpdate

b.Pure Component

Pure Component 又被称为 纯组建
内置了 shouldComponentUpdate
这两种方法很类似原理从源码里面也可以找到

image.png

接受两个参数上一个状态的props和下一个状态的state
返回的结果只能是个booleantrue可以继续,false不能继续

image.png

如果shouldUpdate是false的话
直接bailOut

image.png

后面的更新钩子和协调的逻辑都不会走

image.png

父组件调用changeNothing方法,完全没有改变name

image.png

子组件在render里面console来看看如果继承自Component的时候
不改变Props值会不会重新render

image.png

那是肯定的,那么让我们继承自PureComponent

image.png

pureComponent能够避免这个问题

c.React.memo

React.memo 相当于一个functional组建版本的纯组建

image.png

会比较prevProp(这里的preProps是上次存下来的从memoizedProps里面拿的)和nextProps
以及ref是否相等
如果都相等的话,直接bailOut
接下来的updateFunctionComponent不会走

使用方法十分简单:

image.png

React.memo()可接受2个参数
第一个参数为纯函数的组件
第二个参数用于对比props控制是否刷新
与shouldComponentUpdate()功能类似,flag相反

image.png

false会刷新 true不会刷新

2.数据缓存

useMemo 缓存参数

image.png

根据原码我们可以看出来接受两个参数一个是箭头函数nextCreate去返回一个函数
另外一个是deps是dependence的缩写,这个函数执行与否会拿上一个存在memeoizedState里面的preState和nextDeps进行比较
如果没有变化则不执行,我们把之前的代码改造成functional组件

image.png

父亲组件

image.png

子组件
我们可以试验出来即使点击setContext的时候changeName也是会被调用的,虽然这个方法不需要调用
接下来我们用useMemo这个钩子来优化一下,父组件不用动,子组建做一下更改

image.png

解决了该问题



useCallback 缓存函数

image.png

两者都是比较依赖项是否发生变化
发生变化存储到memoizedState里面
没发生变化直接返回上一次的参数值

不同点是useCallBack是返回函数
useMemo是返回值

3.函数尽量不要使用内联形式

源码里面会进行全等比较,object或者function肯定是不相等的

4.Router中内联函数使用render或者children,不要使用component

当你用component的时候Router会制定组件和React.createElement创建新的React element
每次执行路由的时候都会创造一个新的
不停的挂在卸载,非常影响性能

5.context不要滥用

context是高阶api,发生变化,所有跟它有关的子组建都要重新渲染

总结:减少计算,渲染和不必要的请求