其实主要的点是在memo,memo是React16.6.0推出的(另外一个主要的功能就是React.lazy())
memo其实就是PureComponent的Functional component版本
PureComponent的逻辑其实就是把props和state进行了一层浅比较,如果改变了,那么就调用render().如果没有或者只是包含的某个属性发生了改变,就不重新渲染,最后的目的其实就是实现性能的优化.
所以只推荐在拥有简单的props和state的时候,才推荐去使用PureComponent,一旦涉及复杂的数据结构,就有可能出现model层已经更新了,但是view层经过浅对比,觉得不用更新
所以就有forceUpdate( )这个函数来强制更新
1 | import React ,{Component,PureComponent} from 'react' |
Memo其实大差不差
1 |
|
useMemo
有一个问题就是,有时候父组件的某个state更新,导致整个父组件重新render,然后传给子组件的参数由于父组件的重新render导致地址发生了改变
1 | const Child = memo(({data}) =>{ |
例如data重新被定义,所以data的内存地址发生了改变,导致Child组件重新render,但是data本身的值是没有发生改变的,很浪费
React提供了useMemo的方法,render的时候都会把值和上一次的值进行一个比对,如果值发生了变化在触发Child的render函数
1 | const Child = memo(({data}) =>{ |
useCallback的用法(useMemo的语法糖)
useCallback(x=>console.log(x),[m])
等价于
useMemo(()=>(x)=>console.log(x),[m])