React -PureComponent

253 阅读1分钟
  • PureComponent 通过props 和state的浅比较来优化render次数,改变了生命周期方法shouldComponentUpdate,并且会自动检查组建是否需要重新渲染,根据源码:
if(this._compositeType === compositeTypes.PureClass){
 shouldUpdate =!shallowEqual(prevProps,nextProps) || !shallowEqual(inst.state,nextState)
}

shallowEqual 只会浅比较props ,state,数组或嵌套的对象是不会被比较的

handleAddData = ()=> {
  console.log('add-')
  const { dataInput } = this.state
  let newArr = dataInput
  newArr.push(
    {
      id: 4,
      name: 'test4',
      value: ''
    }
  )

  this.setState({
    dataInput:newArr
  })
}

<div>
  {
    dataInput.map((item,index)=>{
      return (
        <div key={index}>
          {item.name}
          <input type="value" />
        </div>
      )
    })
  }
  <div>
    <button onClick={this.handleAddData}>点击push 数据</button>
  </div>

执行handleAddData,是不会重新render的,因为数组的地址并没有改变,PureComponent 通过浅比较 认为 dataInput 没有改变

为了避免这种情况发生,我们可以深拷贝一个数组来解决

handleAddData = ()=> {
  console.log('add-')
  const { dataInput } = this.state
  let newArr = [...dataInput] // ...拆分 这里修改
  newArr.push(
    {
      id: 4,
      name: 'test4',
      value: ''
    }
  )

  this.setState({
    dataInput:newArr
  })
}