React.Component 和 React.PureComponent 、React.memo 的區別
一 結論
React.Component 是沒有做任何渲染優化的,但凡調用this.setState 就會執行render的刷新操作。
React.PureComponent 是繼承自Component,並且對重寫了shouldComponentUpdate周期函數,對 state 和 props 做了淺層比較,當state 和 props 均沒有改變時候,不會render,僅可以用在ClassComponent中
React.memo 功能同React.PureComponent,但React.memo 為高階組件,既可以用在ClassComponent中 也可以用在 functionComponent中
二 React.Component
需要手動編寫shouldCompoentUpdate進行 props和state的比較判斷是否需要渲染render
Class Sum extends React.Component {
constructor(props){
super(props);
this.state = {
num:0
}
}
shouldCompoentUpdate(nextProps,nextState){
if(nextPorps.sum === this.props.sum && nextState.num === this.state.num){
return false; // 當props 和state 值均沒有改變時候,讓render不渲染
}
return ture; // 其他情況設置成允許渲染
}
render(){
return (
<div>
<span>{this.state.num}</span>
<span>{this.props.sum}</span>
</div>
)
}
}
二 React.PureComponent 和 React.memo 的使用
Class Sum extends React.PureComponent {
// 會自動進行props 和 sate 的淺比較
}
function Add (props){
return (
<div>sum = {props.y + props.x}</div>
)
}
export default React.memo(Add)
注意:當props 或者 state 為一個 Object類型時候,淺比較會失效 即 props ,state 發生改變,依舊會阻止render渲染。
此時可以運用的方法有
1 修改state時候,採用 object.assin({},)進行組件合併
2 採用 解構賦值進行淺拷貝賦值,這樣props或者state 就不再為原來的值了,可以觸發render刷新操作
3 當組件結構較複雜,存在較多 Object類型時候 建議改為使用React.Component