react性能優(yōu)化

React 性能優(yōu)化

React 中的性能優(yōu)化丈莺,一般都是immer+純組件(React.PureComponent)/memo(shouldComponentUpdate())划煮。

  • 函數(shù)組件里面用 React.memo()
  • 類組件里面用 React.PureComponent 或 shouldComponentUpdate()。

如果正常我們什么都不使用缔俄,父組件更新弛秋,子組件肯定會更新器躏。
但是父組件只需要 render 它需要更新的地方就行了,有些子組件不需要更新蟹略。為了達到這個目的登失,我們就需要 shouldComponentUpdate 了。

它做了一次淺比較挖炬,引用類型不變是不會 render 的揽浙。所以要用 useMemo useCallback immer 這種。

React.PureComponent

scu 造成的性能問題及不可變類型是如何解決的

shouldComponentUpdate(nextProps, nextState) {
  return true;
}

React.PureComponent意敛,用當前與之前 props 和 state 的淺比較覆寫了 shouldComponentUpdate() 的實現(xiàn)馅巷。

React.memo

React.memo 僅檢查 props 變更,也是淺比較草姻,如果函數(shù)組件被 React.memo 包裹钓猬,且其實現(xiàn)中擁有 useState,useReducer 或 useContext 的 Hook碴倾,當 state 或 context 發(fā)生變化時逗噩,它仍會重新渲染。跌榔?

const MyComponent = React.memo(function MyComponent(props) {
  /* 使用 props 渲染 */
});

如果需要進行深比較自己判斷邏輯异雁,可以在 React.memo()方法中傳入傳入第二個參數(shù)

unction MyComponent(props) {
  /* 使用 props 渲染 */
}
function areEqual(prevProps, nextProps) {
  /*
  如果把 nextProps 傳入 render 方法的返回結(jié)果與
  將 prevProps 傳入 render 方法的返回結(jié)果一致則返回 true,
  否則返回 false
  */
}
export default React.memo(MyComponent, areEqual);

大家詬病 react 的地方是指:父組件更新僧须,只需要 render 他需要更新的地方就行了纲刀,有些子組件不需要更新,都是需要我們使用者來處理這些性能優(yōu)化邏輯担平,React 內(nèi)部沒幫忙處理這些示绊。為什么 React 內(nèi)部不直接自己處理這些邏輯呢?

1.scu 是淺比較暂论,這種對很多人就不適用 2.有些簡單場景不用這個 3.為什么是淺比較面褐,因為時間片較為固定,所以希望這個比較的時間相對固定取胎,這個是深比較做不到的

問題

  1. React.memo 和 useMemo 的區(qū)別是什么
    React.memo 是高階組件(hoc)展哭,用來包裝不想重復(fù)渲染的組件,除非 props 發(fā)生變化
    useMemo 是一個 React Hook闻蛀,在組件中包裝函數(shù)匪傍,確保函數(shù)的值只有在其依賴項其一發(fā)生變化時才重新計算。
    memoization 雖然表面上看是隨處可用的觉痛,但是最好在絕對需要使用時才使用役衡,它會占用機器上的內(nèi)存空間。

useMemo 返回的是 JSX.Element薪棒,而 memo 返回的是 JSXConstructor手蝎。

React.memo() 和 useMemo() 的用法和區(qū)別

React context 的性能優(yōu)化

context 解決了多個層級之間傳遞 props 的問題榕莺。但是只要 context 的 value 發(fā)生變化,所有消費該 context 組件都是重新渲染柑船。
比如帽撑,context 的 value 為

{
    count1: 'a',
    count2: 'b',
}

子組件 A 消費 count1,子組件 B 消費 count2鞍时,count1 發(fā)生變化時,子組件 A 和子組件 B 都會發(fā)生重新渲染扣蜻,但是這個時候其實子組件 B 是不需要重新渲染的逆巍。

如何解決這個問題呢
React Context 性能優(yōu)化

  1. 拆分 context,更細顆粒度的拆分
  2. 使用 useMemo 和 React.memo

vuex 和 redux 的區(qū)別:

Vuex 與 Redux 比較

實現(xiàn)原理:
Redux 使用的是不可變數(shù)據(jù)類型莽使,Redux 每次都是使用新的 state 替換舊的 state锐极。
Vuex 使用的是可變數(shù)據(jù)類型,Vuex 是直接修改芳肌。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末灵再,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子亿笤,更是在濱河造成了極大的恐慌翎迁,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件净薛,死亡現(xiàn)場離奇詭異汪榔,居然都是意外死亡,警方通過查閱死者的電腦和手機肃拜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進店門痴腌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人燃领,你說我怎么就攤上這事士聪。” “怎么了猛蔽?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵剥悟,是天一觀的道長。 經(jīng)常有香客問我枢舶,道長懦胞,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任凉泄,我火速辦了婚禮躏尉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘后众。我一直安慰自己胀糜,他們只是感情好颅拦,可當我...
    茶點故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著教藻,像睡著了一般距帅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上括堤,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天碌秸,我揣著相機與錄音,去河邊找鬼悄窃。 笑死讥电,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的轧抗。 我是一名探鬼主播恩敌,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼横媚!你這毒婦竟也來了纠炮?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤灯蝴,失蹤者是張志新(化名)和其女友劉穎恢口,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體绽乔,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡弧蝇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了折砸。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片看疗。...
    茶點故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖睦授,靈堂內(nèi)的尸體忽然破棺而出两芳,到底是詐尸還是另有隱情,我是刑警寧澤去枷,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布怖辆,位于F島的核電站,受9級特大地震影響删顶,放射性物質(zhì)發(fā)生泄漏竖螃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一逗余、第九天 我趴在偏房一處隱蔽的房頂上張望特咆。 院中可真熱鬧,春花似錦录粱、人聲如沸腻格。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽菜职。三九已至青抛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間酬核,已是汗流浹背蜜另。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留愁茁,地道東北人蚕钦。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像鹅很,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子罪帖,可洞房花燭夜當晚...
    茶點故事閱讀 43,658評論 2 350

推薦閱讀更多精彩內(nèi)容

  • 平常在完成業(yè)務(wù)功能開發(fā)后促煮,不知道你是否還會精益求精,做一些性能優(yōu)化方面的工作呢整袁?React框架中有一些性能優(yōu)化相關(guān)...
    SCQ000閱讀 1,355評論 0 52
  • webpack階段 路由階段 1 .路由懶加載2 .React.lazy 目前只支持默認導(dǎo)出(default ex...
    skoll閱讀 1,073評論 0 0
  • 今天給朋友們詳細介紹react如何進行性能優(yōu)化菠齿。 首先要了解網(wǎng)頁性能不好的罪魁禍首 瀏覽器的回流【重排版】和重繪(...
    wenzi8705_GG閱讀 840評論 0 1
  • tips:歡迎關(guān)注我在github的博客點擊查看 。 使用React.pureComponent坐昙,React.me...
    aermin閱讀 1,293評論 0 1
  • 1, React.PureComponent React.PureComponent 與 React.Comp...
    城南boy閱讀 545評論 0 0