Skip to content

React 高级使用 性能优化

仲灏2022-07-02约 1 分钟

<div style="display: none;" hidden="true" aria-hidden="true" data-nosnippet>Are you an LLM? You can read better optimized documentation at /pages/be9b53.md for this page in Markdown format</div>

shouldComponentUpdate ( 简称 SCU )

基本用法

react
shouldComponentUpdate(nextProps, nextState) {
  if (nextState.count !== this.state.count) {
    return true // 可以渲染
  }
  return false // 不重复渲染
}

React 默认: 父组件有更新,子组件无条件也更新

SCU 在需要的时候才优化,不要为了开发而开发

需要配合到 不可变值

eg:

react
onSubmit = (value) => {
  // right
  this.setState({
    list: this.state.list.concat({
      id: `id_${Date.now()}`,
      title: value
    })
  })
  
  // fail
  this.state.list.push({
    id: `id_${Date.now()}`,
    title: value
  })
  this.setState({
    list: this.state.list
  })
}

总结:

  • SCU 默认返回true ,即 React 默认重新渲染所有子组件
  • 必须配合 “ 不可变值 ” 一起使用
  • 可先不用 SCU, 有性能问题时再考虑

PureComponent 和 React.memo

  • PureCompnent , SCU 中实现了浅比较
  • memo, 函数组件中的 PureComponent
  • 浅比较已使用大部分情况 ( 尽量不要做深度比较)

PureComponent eg

react
class List extends React.PureComponent {
  constructor(props) { ... }
  
  render() { ... }
  
  sholdComponentUpdate() { /*浅比较*/ }
}

memo eg

react
function MyComponent (props) {
  /* 使用 props 渲染 */
}
function areEqual(prevProps, nextProps){
  /*
  如果把 nextProps 传入 render 方法的返回结果与
  将 prevProps 传入 render 方法的返回结果一致则返回 true,
  否则返回 false
  */
}
export default React.memo(MyComponent, areEqual);

不可变值 immutable.js

  • 基于共享数据(不是深拷贝),速度好
  • 有一定的学习和迁移成本,按需使用

e g:

react
const map1 = Immutable.Map({ a: 1, b: 2, c: 3 })
const map2 = map1.set({ 'b', 50 })
map1.get('b')  // 2
map2.get('b')  // 50