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對象變化時的重渲染。對象

相關文章
相關標籤/搜索