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屬於引用類型,即便改變其中數據,他們指向的仍是同一內存地址,因此採用上面的判斷就不行了。react
obj: { age: 12, name: 'xioabbao', student: { count: 1 } }
(1)使用setState改變數據以前,先採用es6中assgin進行拷貝,可是assgin只深拷貝的數據的第一層,因此說不是最完美的解決辦法。es6
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去學習。學習