React重渲染时的浅拷贝

React的有状态组件在state发生变化时会重渲染,
重渲染过程为:state变化-->shouldComponentUpdate/ComponentWillReceiveProps-->componentWillUpdate-->render-->componentDidUpdate。react

react进入重渲染的断定依据是state对象属性值的浅比对,若是咱们须要深比对state属性值重渲染,该怎么解决呢?bash

好比函数

this.state={
type:0,
personnal:{
    name:"Tom",
    age:16
 }
}
复制代码

改成ui

this.state={
type:0,
personnal:{
    name:"Tom",
    age:20
 }
}
复制代码

此时,只改变personnal对象中的age属性值,react机制判断这次变化不会进入shouldComponentUpdate/ComponentWillReceiveProps。this

咱们加入一个开关变量personnalChange,做为personnal对象变化时的重渲染开关。spa

this.state={
type:0,
personnal:{
    name:"Tom",
    age:16
 },
 personnalChange:0
}
复制代码

在改变personnal属性值时,同时改变开关变量personnalChange,经过浅拷贝让react知道personnal对象发生了变化,从而进行重渲染。code

this.setState({
    personnal:{
    name:"Tom",
    age:20
 },
 personnalChange:!this.state.personnalChange
})
复制代码

此时,personnalChange变化后进入shouldComponentUpdate/ComponentWillReceiveProps,在钩子函数中进行业务逻辑的处理和重渲染。component

shouldComponentUpdate(nextProps,nextState){
    if(this.state.personnalChange!==nextState.personnalChange){
        //业务逻辑
        ....
        //重渲染
        return true
    }
}
复制代码

经过开关变量personnalChange实现personnal对象变化时的重渲染。对象

相关文章
相关标签/搜索