在 React 中,Component 和 PureComponent 的核心區別就在於 是否自動進行淺層比較 (shallow compare),從而決定組件是否需要重新渲染。
1. React.Component
Component 不會自動比較 props 或 state,只要父組件重新渲染(哪怕 props 沒變),它也會執行 render()。
換句話説:
默認每次都重新渲染
除非你自己寫 shouldComponentUpdate 去控制
class MyComponent extends React.Component {
render() {
console.log('Component render');
return <div>{this.props.value}</div>;
}
}
2. React.PureComponent
PureComponent 內部帶了一個自動的:shouldComponentUpdate( nextProps, nextState )
並執行 淺層比較 (shallow equal):
- props 沒變(淺比較)
- state 沒變(淺比較)
就不會重新渲染
從而減少不必要的 render
示例:
class MyPureComponent extends React.PureComponent {
render() {
console.log('PureComponent render');
return <div>{this.props.value}</div>;
}
}
如果 props/state 沒變,render() 不會執行。
淺比較(shallow compare)是什麼意思?
對比的是引用是否相同,不是內容是否相同。
例如:
{ a: 1 } === { a: 1 } // false(引用不同)
所以:
- 如果 props 是基本類型(number、string、boolean):效果很好
- 如果 props 是對象、數組,且你用 mutable 修改方式,引用不變 → PureComponent 會認為沒變 → 不會更新(BUG)
Component 與 PureComponent 的對比總結
|
特性
|
Component
|
PureComponent
|
|
是否自動比較 props/state
|
❌ 否
|
✅ 是(淺比較)
|
|
是否減少無效渲染
|
❌ 否
|
✅ 是
|
|
是否容易踩坑
|
👍 穩定
|
⚠️ 如果 props 是對象/數組容易誤判
|
|
常見用途
|
默認所有組件
|
性能優化、UI 展示型組件
|
什麼時候用 PureComponent?
- props/state 基本類型
- props/state 是不可變數據(使用 immutable 或通過擴展符結構拷貝)
例如:
this.setState({ list: [...this.state.list, newItem] })
什麼時候不要用 PureComponent?
當 props 或 state 經常是:
- 嵌套對象
- 嵌套數組
- 引用不變但內容變了
例如:
this.state.obj.a = 1; // 引用沒變
this.setState({ obj: this.state.obj }); // PureComponent 判斷不出變化
會導致界面不更新。
總結
Component:默認每次都更新
PureComponent:自動淺比較,不變就不更新(性能優化)
想要性能更好、避免重複渲染 → 用 PureComponent
但要注意:一定要保持 props/state 的不可變性