眾所周知,react中props,state值的變化,會導致元件重新渲染。使用shouldComponentUpdate就是為了減少render不必要的渲染。 本文著重回答以下問題:
1:如何使用使用shouldComponentUpdate記性優化;
shouldComponentUpdate(nexrProps) {
if (this.props.num === nexrProps.num) {
return false
}
return true;
}
相信大家都知道這種方式,shouldComponentUpdate提供了兩個引數nextProps和nextState,表示下一次props和一次state的值,當函式返回false時候,render()方法不執行,元件也就不會渲染,返回true時,元件照常重渲染。此方法就是拿當前props中值和下一次props中的值進行對比,資料相等時,返回false,反之返回true。但是此方法面對複雜的物件時,就沒有效果了,比如說props長成這樣,就沒法應對了,因為在js中,object,array,function屬於引用型別,即使改變其中資料,他們指向的還是同一記憶體地址,所以採用上面的判斷就不行了。
obj: {
age: 12,
name: 'xioabbao',
student: {
count: 1
}
}
2: 解決方法有三種:
(1)使用setState改變資料之前,先採用es6中assgin進行拷貝,但是assgin只深拷貝的資料的第一層,所以說不是最完美的解決辦法。
const o2 = Object.assign({},this.state.obj)
o2.student.count = '00000';
this.setState({
obj: o2,
})
(2)使用JSON.parse(JSON.stringfy())進行深拷貝,但是遇到資料為undefined和函式時就會錯。
const o2 = JSON.parse(JSON.stringify(this.state.obj))
o2.student.count = '00000';
this.setState({
obj: o2,
})
(3)使用immutable.js進行專案的搭建。immutable中講究資料的不可變性,每次對資料進行操作前,都會自動的對資料進行深拷貝,專案中資料採用immutable的方式,可以輕鬆解決問題,但是又多了一套API去學習。