1.減少Store中的更新次數(shù)逛球。將更少的數(shù)據放在store中偷遗。
充分利用React組件化的能力驶忌,使得不必要的數(shù)據不再放入Store中。一般組件涉及到的數(shù)據分為兩類:一種是組件內部使用的數(shù)據酣倾,不與其他組件發(fā)生耦合或影響的數(shù)據;另外一種就是業(yè)務數(shù)據谤专,影響多組件的數(shù)據或者多組件共享數(shù)據躁锡。
將組件內部使用的數(shù)據遷移到組件內, 拆分開之后將大大減少store的更新次數(shù)置侍。
2.減少不必要的組件更新映之,也就是說當數(shù)據被更新之后,如果相應的組件內的數(shù)據沒有被更新蜡坊,那么這個組件就不要進行重復的計算杠输。
shouldComponentUpdate: 當新數(shù)據進來之后,React組件會調用一個函數(shù)。ShouldComponentUpdate來判斷是否進行下一步的渲染秕衙,所以我們可以在這個函數(shù)中做一些基本的判斷蠢甲,來決定是否進行下一步的計算。這里有兩個判斷方法据忘,一種采用深度比較鹦牛,一種采用淺度比較。
- 深度比較可以很好的判斷數(shù)據是否發(fā)生改變勇吊,但 deepCopy 和 deepCompare 一般都是非常耗性能的曼追。
2.另一種是淺度比較,這種比較方法只需要比較數(shù)據的引用是否發(fā)生變化即可汉规,這種比較方法效率高但是對數(shù)據的更新和類型有一定的要求礼殊。
這種數(shù)據結構需要滿足一旦數(shù)據被更新,那么它的引用就會被更新针史;而數(shù)據沒更新晶伦,那么它的引用也不會發(fā)生變化。 這里我們有兩個選擇 :immutable.js 和 react-addon-update
- immutable.js
ImmutableJs是一套fackbook提供的數(shù)據結構啄枕,這套數(shù)據結構無法被直接更改數(shù)據一旦被更改婚陪,它的引用也會相應的發(fā)生變化,其內部使用的了非常高效的算法能夠復用很多數(shù)據射亏,所以對immutableJs的數(shù)據更改非常高效近忙。
Immutable 則提供了簡潔高效的判斷數(shù)據是否變化的方法,只需 === 和 is 比較就能知道是否需要執(zhí)行 render()智润,而這個操作幾乎 0 成本及舍,所以可以極大提高性能。
相對而言的限制:
immutableJs是一套新的數(shù)據結構窟绷,所以操作的時候需要查詢它的api來完成锯玛,但用它的API很多,很雜,而JS語言本身沒有靜態(tài)類型檢查攘残,在使用時候非常容易出錯拙友,所以這里建議可能需要配合Typescript等支持語法檢查的語言一起使用,這樣能夠編譯階段檢查出來問題歼郭;
使用ImmutableJs生成的數(shù)據結構遗契,無法使用現(xiàn)有的各種js庫進行操作,這會造成很大的不方便病曾。
react-addon-update
這個插件接收兩個參數(shù)牍蜂,一個是更新的對象,另一個我們叫做spec,代指你告訴這個函數(shù)該如何更新對象泰涂。在更新數(shù)據的時候可以避免克隆操作鲫竞,同時又能夠達到ImmutableJS數(shù)據結構的效果。
(在深度克隆方面逼蒙,Object.assign 效率不低从绘,屬于shallowClone,但是如果對象數(shù)據有多層的話是牢,就需要手動去做這件事情僵井,才能保證上面提到的引用數(shù)據效果。使用 react-addon-update 或者 ImmutableJs 的話妖泄,代碼看起來會比較簡潔驹沿。)
總結來看,在使用redux + react的過程中蹈胡,我們想要提供他的性能的話,可以從這三個方面入手:
- 減少store的更新次數(shù)朋蔫,這個主要通過組件化來解決罚渐,ui 和臨時數(shù)據不再存放在Store中。
2.避免不必要的Component渲染驯妄,假設數(shù)據層能夠提供準確的數(shù)據更新荷并,即數(shù)據更新了,數(shù)據引用也會發(fā)生改變青扔,數(shù)據沒有更新源织,那么它的引用就不會發(fā)生變化,這樣的話我們可以在ShouldComponentUpdate函數(shù)進行判斷是否進行下一步的計算微猖。
- 提高數(shù)據層的計算效率谈息,避免克隆操作, 通過使用immutablejs 或者react-addon-update來達到只更新想要更新的數(shù)據。