react在每個元件生命週期更新的時候都會呼叫乙個shouldcomponentupdate(nextprops, nextstate)函式。它的職責就是返回true或false,true表示需要更新,false表示不需要,預設返回為true,即便你沒有顯示地定義 shouldcomponentupdate 函式。這就不難解釋上面發生的資源浪費了。
為了進一步說明問題,我們再引用一張官網的圖來解釋,如下圖( scu表示shouldcomponentupdate,綠色表示返回true(需要更新),紅色表示返回false(不需要更新);vdomeq表示虛擬dom比對,綠色表示一致(不需要更新),紅色表示發生改變(需要更新)):
根據渲染流程,首先會判斷shouldcomponentupdate(scu)是否需要更新。如果需要更新,則呼叫元件的render生成新的虛擬dom,然後再與舊的虛擬dom對比(vdomeq),如果對比一致就不更新,如果對比不同,則根據最小粒度改變去更新dom;如果scu不需要更新,則直接保持不變,同時其子元素也保持不變。
為什麼要bind:
這是因為es6寫法,也就是類(class)的寫法,react預設不會自動繫結類中的方法造成的。
react對es5的語法是預設有自動繫結,所以不需要加這個。
而且,自動綁不繫結也是react決定要不要的from:
不論你用不用immutable,只要你想達到pure render,下面值得你注意!!!
一天我和往常一樣,開開心心得寫著react,用著@purerender,
export default class extends component =this.state;
return (
person>//bug 所在
)}...
}
發現乙個問題,對於person這個子元件來說,在父元件re-render的時候,即使person得前後兩個props都沒改變,它依舊會re-render。。即使用immutable.js也不好使。。。原來啊,父元件每次render,_handleclick都會執行bind(this)
這樣_handleclick的引用每次都會改。。所以person前後兩次props其實是不一樣的。。那怎麼辦?把bind(this)去掉?不行 還必須得用真正的答案是 讓父元件每次render 不執行bind(this),直接提前在定義class裡面的constructor執行好
export default class extends component
render() =this.state;
return (
person>
div>
)}...
}
react學習記錄 更新階段的元件生命週期
關於更新階段的元件生命週期 shouldcomponentupdate nextprops,nextstate 你可以通過這個方法控制項是否重新渲染。如果返回false元件就不會重新渲染。這個生命週期在 react.js 效能優化上非常有用。componentwillreceiveprops nex...
軟體生命週期的主要階段
軟體生命週期 sdlc 的六個階段 1 問題的定義及規劃 此階段是軟體開發方與需求方共同討論,主要確定軟體的開發目標及其可行性。2 需求分析 在確定軟體開發可行的情況下,對軟體需要實現的各個功能進行詳細分析。需求分析階段是乙個很重要的階段,這一階段做得好,將為整個軟體開發專案的成功打下良好的基礎。唯...
React階段 生命週期函式
生命週期函式的存在,就是為了能夠將頁面載入的過程分割開來 便於開發和後期維護,提高效率 掛載階段 unsafe componentwillmount render componentdidmount 資料更新階段 修改資料前只會觸發render 方法 修改資料後全部觸發 父元件更新導致子元件更新時,...