一、React組件何時發生渲染——何時會生成React元素?
React組件的渲染發生在兩個階段。
1. 組件掛載。
2. 組件更新。
二、React組件更新的觸發條件是什么?
對
沒有實現shouldComponentUpdate方法的繼承自Component的class組件來說:①父組件更新或者②該組件調用setState方法后,該組件會更新。
對
function組件來說:①父組件更新之后,該組件會更新。
當使用
繼承自PureComponent的class組件或
使用memo來包裝的function組件時,
組件更新與否的判斷條件是——比較前后兩次props和state的屬性值是否嚴格相等?若是嚴格相等,則組件不會重新渲染。若不是嚴格相等,則會重新渲染,生成新的React元素。
在
編寫了shouldComponent的class組件或使用
傳入areEqual函數的memo函數所包裝的function組件上的更新觸發條件是什么樣的呢?
shouldComponentUpdate(props, state) 返回true則重新渲染組件。(在該函數中,你可以得到props和state變化前后的值。)
areEqual(prevProps, nextProps) 返回false則重新渲染組件。(在該函數中,你可得到props變化前后的值。)
另外,
使用hook之后的function組件的更新情況需要額外注意。當hook生成的state發生改變時,function組件是否更新的條件是——前后兩次的state是否嚴格相等。
若嚴格相等,則不重新渲染組件,若不嚴格相等,則重新渲染組件。
參考資料:
[1] shouldComponent.
https://reactjs.bootcss.com/docs/react-component.html#shouldcomponentupdate.
[2] PureComponent.
https://reactjs.bootcss.com/docs/react-api.html#reactpurecomponent.
[4] shouldComponentUpdate作用.
https://reactjs.bootcss.com/docs/optimizing-performance.html#shouldcomponentupdate-in-action.