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对象变化时的重渲染。对象