Profiler
测量渲染一个 React 应用多久渲染一次以及渲染一次的“代价”。 它的目的是识别出应用中渲染较慢的部分,或是可以使用类似 memo 优化的部分,并从相关优化中获益。
单个组件的性能优化
shouldComponentUpdate
shouldComponentUpdate 决定了组件什么时候不需要渲染
对于无状态组件
无状态组件 shouldComponentUpdate 默认返回 true,只要 props 改变就会渲染
react-redux 的 connect 函数
connect 函数实际产生了一个无名的 react 组件类,这个类定制了 shouldComponentUpdate 函数的实现。 react-redux 提供的 shouldComponentUpdate 函数使用浅层比较(===)对比 props 是否发生变化。 所以对于 props 类型为复杂对象,这样的比较总是认为 props 发生了变化。
- 在使用 props 的时候可以使 props 指向同一 JS 对象
// 确保这个初始化只执行一次,不放在render中
const fooStyle = {color: 'red'}
<Foo style={fooStyle} />
<TodoItem
key={item.id}
onToggle={onToggleTodo}
/>
- 将组件自己的处理函数内聚到自己的组件内部,减少暴露到外部的 props
多个 react 组件的性能优化
对于原组件根节点的类型发生变化,组件会直接被卸载。对于节点类型未发生改变的情况可分为两类:1.是节点为 DOM 类型,react 会保留节点对应的 DOM 元素,值对比节点的属性和内容,然后更改修改的部分。 2.节点为 react 组件,会经历一系列钩子函数。
- 避免组件根节点类型的变化
- 添加一个唯一的 key
使用 reselect 提高获取性能
优化 mapStateToProps 函数。