本文共 2629 字,大约阅读时间需要 8 分钟。
react 使用diff算法,使用key来做同级比对。如果使用数组下标作为key,有以下情况:
在数组头部或中部插入或删除元素:所有key对应的节点的值发生更改,进行重新渲染。造成性能损耗
而如果使用数组中唯一值来作为key:不管是在何处插入或删除节点,其他key对应的节点的值未发生更改,只需插入或删除操作的数组节点。
使用shouldComponentUpdate()以让React知道当前状态或属性的改变是否不影响组件的输出,默认返回ture,返回false时不会重写render,而且该方法并不会在初始化渲染或当使用forceUpdate()时被调用.
如果在组件树的根节点发生更新则所有子节点都会发生更新,这时对所有子节点使用shouldComponentUpdate来减少子节点的渲染,无疑会增加很多代码。我们可以选择使用PureComponent来处理。
React.PureComponent 和 React.Component
PureComponent 和 Component的区别是:Component需要手动实现 shouldComponentUpdate,而PureComponent通过浅对比默认实现了shouldComponentUpdate方法
浅比较
(shallowEqual),即react源码中的一个函数,然后根据下面的方法进行是不是 PureComponent
的判断,帮我们做了本来应该我们在 shouldComponentUpdate
中做的事情
if (this._compositeType === CompositeTypes.PureClass) { shouldUpdate = !shallowEqual(prevProps, nextProps) || ! shallowEqual(inst.state, nextState);}
注意:浅比较对引用类型(数组/对象)只比较引用的地址,不会比较引用的实际指向的对象属性。
React.memo
React.memo为高阶组件。它与 React.PureComponent 非常相似,但它适用于函数组件,但不适用于 class 组件。
如果你的函数组件在给定相同 props 的情况下渲染相同的结果,那么你可以通过将其包装在 React.memo 中调用,以此通过记忆组件渲染结果的方式来提高组件的性能表现。这意味着在这种情况下, React 将跳过渲染组件的操作并直接复用最近一次渲染的结果。
React.memo 依然是一种对象的浅比较(默认),有复杂对象时无法 render
。在 React.memo
中 可以自定义其比较方法的实现。
function MyComponent(props) { /* render using props */}function areEqual(prevProps, nextProps) { /* return true if passing nextProps to render would return the same result as passing prevProps to render, otherwise return false */}export default React.memo(MyComponent, areEqual);
和PureComponent的区别:
总结
PureComponent不仅会影响本身,而且会影响子组件,所以PureComponent最佳情况是展示组件
高阶组件是参数为组件,返回值为新组件的函数。HOC 是纯函数,没有副作用。HOC 在 React 的第三方库中很常见,例如 Redux 的 connect
高阶组件的作用:
高阶组件的实现:
代码层面:
return null
而不是CSS的 display:none
来控制节点的显示隐藏。保证同一时间页面的DOM节点尽可能的少。props
和 state
的数据尽可能简单明了,扁平化。render
里面尽量减少新建变量和 bind
函数,传递参数是尽量减少传递参数的数量。代码体积优化:
性能检测工具:
从实现原理上来说,最大的区别是两点:
转载地址:http://bxqni.baihongyu.com/