區(qū)別點:
- 前者自帶通過props和state的淺對比來實現(xiàn) shouldComponentUpate(),而后者沒有,只要props變化都會render;
PureComponent缺點
- 可能會因深層的數(shù)據(jù)不一致而產(chǎn)生錯誤的否定判斷,從而shouldComponentUpdate結果返回false,界面得不到更新。
PureComponent優(yōu)勢
- 不需要開發(fā)者自己實現(xiàn)shouldComponentUpdate,就可以進行簡單的判斷來提升性能。
為什么PureComponent比較復雜的數(shù)據(jù)結構,可能會因深層的數(shù)據(jù)不一致而產(chǎn)生錯誤的否定判斷?
JavaScript 中的對象一般是可變的(Mutable),因為使用了引用賦值,新的對象簡單的引用了原始對象,改變新的對象將影響到原始對象。如 foo={a: 1}; bar=foo; bar.a=2 你會發(fā)現(xiàn)此時 foo.a 也被改成了 2。
- 為了解決這個問題,一般的做法是使用
shallowCopy(淺拷)或deepCopy(深拷貝)來避免被修改,但這樣做造成了 CPU 和內(nèi)存的浪費。
例如:
let foo = {a: {b: 1}};
let bar = foo;
bar.a.b = 2;
console.log(foo.a.b); // 打印 2
console.log(foo === bar); // 打印 true
如果要使用PurComponent的話,如何避免不會render的問題?
- 避免使用值可能會突變的屬性或狀態(tài),而是使用副本來返回新的變量。
- 另外一種方式是使用Immutable.js。
提示
