亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

React如何避免重渲染

2024-05-06 16:43:42
字體:
來源:轉載
供稿:網友

組件的重新渲染

我們可以在 React 組件中的 props 和 state 存放任何類型的數據,通過改變 props 和 state,去控制整個組件的狀態。當 props 和 state 發生變化時,React 會重新渲染整個組件,組件重新渲染的過程可簡化如下圖:

React,重渲染,避免重渲染

譯者之前對diff的理解是,對于一個改變 props 的組件,diff能自動計算出組件內部DOM樹的不同,然后經過對比,找出真正變化的DOM節點,對變化部分進行渲染。這個是錯誤的理解,diff算法只是用來計算出改變狀態或 props的組件/虛擬節點,而這個組件/虛擬節點,無論多大,它都會重新渲染。

假設有一個渲染完成的組件,如下圖:

React,重渲染,避免重渲染

接下來因為狀態改變,需要重新渲染下圖的綠色的節點,如下圖:

React,重渲染,避免重渲染

一般的想法是只需要更新下面的三個綠色節點就能夠完成組件的更新

React,重渲染,避免重渲染

然而!只要組件的 props 或 state 發生了變化就會重新渲染整個組件,因此除了上述的三個綠色節點以外,還需要重新渲染所有的黃色的節點

React,重渲染,避免重渲染

除了必要渲染的三個節點外,還渲染了其他不必要渲染的節點,這對性能是一個很大的浪費。如果對于復雜的頁面,這將導致頁面的整體體驗效果非常差。因此要提高組件的性能,就應該想盡一切方法減少不必要的渲染。

shouldComponentUpdate

shouldComponentUpdate這個函數會在組件重新渲染之前調用,函數的返回值確定了組件是否需要重新渲染。函數默認的返回值是 true,意思就是只要組件的 props 或者 state 發生了變化,就會重新構建 virtual DOM,然后使用 diff 算法進行比較,再接著根據比較結果決定是否重新渲染整個組件。函數的返回值為 false 表示不需要重新渲染。

函數默認返回為 true.

PureRenderMixin

React 官方提供了 PureRenderMixin 插件,插件的功能就是在不必要的情況下讓函數 shouldComponentUpdate 返回 false, 使用這個插件就能夠減少不必要的重新渲染,得到一定程度上的性能提升,其使用方法如下:

  import PureRenderMixin from 'react-addons-pure-render-mixin';  class FooComponent extends React.Component {   constructor(props) {    super(props);    this.shouldComponentUpdate = PureRenderMixin.shouldComponentUpdate.bind(this);   }   render() {    return <div className={this.props.className}>foo</div>;   }  }

我們需要在組件中重寫 shouldComponentUpdate,PureRenderMixin源碼中對PureRenderMixin.shouldComponentUpdate的定義是這樣

  shouldComponentUpdate(nextProps, nextState) {    return shallowCompare(this, nextProps, nextState);  }

重寫的方法里面根據組件的目前的狀態和組件接下來的狀態進行淺比較,如果組件的狀態發生變化則返回結果為 false,狀態沒有發生變化則返回結果為 true

  shouldComponentUpdate(nextProps, nextState) {    return !shallowEqual(this.props, nextProps) ||        !shallowEqual(this.state, nextState);  }

在 React 的最新版本里面,提供了 React.PureComponent 的基礎類,而不需要使用這個插件。

譯者注:所以在一個較大的組件決定重渲染的時候,我們可以在每一個子組件中綁定新的shouldComponentUpdate方法,這樣可以減少子組件重新渲染的次數。

我們自己可以重寫 shouldComponentUpdate 這個函數,使得其能夠對任何事物進行比較,也就是深比較(通過一層一層的遞歸進行比較),深比較是很耗時的,一般不推薦這么干,因為要保證比較所花的時間少于重新渲染的整個組件所花的時間,同時為了減少比較所花的時間我們應該保證 props 和 state 盡量簡單,不要把不必要的屬性放入 state,能夠由其他屬性計算出來的屬性也不要放入 state 中。

Immutable.js

對于復雜的數據的比較是非常耗時的,而且可能無法比較,通過使用 Immutable.js 能夠很好地解決這個問題,Immutable.js 的基本原則是對于不變的對象返回相同的引用,而對于變化的對象,返回新的引用。因此對于狀態的比較只需要使用如下代碼即可:

  shouldComponentUpdate() {    return ref1 !== ref2;  }

同樣需要我們在子組件中將shouldComponentUpdate方法重寫。

Pure Component

如果一個組件只和 props 和 state 有關系,給定相同的 props 和 state 就會渲染出相同的結果,那么這個組件就叫做純組件,換一句話說純組件只依賴于組件的 props 和 state,下面的代碼表示的就是一個純組件。

   render() {     return (       <div style={{width: this.props.width}}>           {this.state.rows}       </div>     );  }

如果某個子組件的 props 是固定的不會發生變化,我們叫做無狀態組件。在這個組件里面使用 pureRenderMixin 插件,能夠保證 shouldComponentUpdate 的返回一直為 false。所以,分清純組件和無狀態組件,在無狀態組件中重寫shouldComponentUpdate方法是最好的選擇。

key

在寫動態子組件的時候,如果沒有給動態子項添加key prop,則會報一個警告。這個警告指的是,如果每一個子組件是一個數組或者迭代器的話,那么必須有一個唯一的key prop,那么這個key prop是做什么的呢?
我們想象一下,假如需要渲染一個有5000項的成績排名榜單,而且每隔幾秒就會更新一次排名,其中大部分排名只是位置變了,還有少部分是完全更新了,這時候key就發揮作用了,它是用來標識當前的唯一性的props?,F在嘗試來描述這一場景

  [{   sid: '10001',   name: 'sysuzhyupeng'  }, {   sid: '10008',   name: 'zhyupeng'  }, {   sid: '120000',   name: 'yupeng'  }]

其中sid是學號,那么我們來實現成績排名的榜單

  import React from 'react';  function Rank({ list }){    return (     <ul>       {list.map((entry, index)=>(         <li key={index}>{entry.name}</li>       ))}     </ul>    )  }

我們把key設成了序號,這么做的確不會報警告了,但這樣是非常低效的做法,這個key是用來做virtual Dom diff的,上面的做法相當于用了一個隨機鍵,那么不論有沒有相同的項,更新都會重新渲染。

正確的做法非常簡單,只需要把key的內容換成sid就可以了。

那么還有另一個問題,當key相同的時候,React會怎么渲染呢,答案是只渲染第一個相同key的項,且會報一個警告。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
xvideos亚洲| 精品五月天久久| 国产精品久久久久久久久久ktv| 国产盗摄xxxx视频xxx69| 精品一区精品二区| 成人网在线观看| 国产69精品久久久久久| 91久久在线观看| 人妖精品videosex性欧美| 黄网动漫久久久| 精品国产老师黑色丝袜高跟鞋| 欧美激情亚洲自拍| 欧美日韩午夜激情| 亚洲天堂成人在线视频| 日韩精品视频中文在线观看| 97国产精品视频| 秋霞av国产精品一区| 欧美性猛交xxxx乱大交蜜桃| 亚洲日韩中文字幕| 日本亚洲欧洲色| 国产精品视频最多的网站| 伊人伊成久久人综合网站| www国产精品com| 黑人巨大精品欧美一区免费视频| 欧美日韩在线视频一区| 国产mv免费观看入口亚洲| 成人信息集中地欧美| 日韩av免费观影| 色小说视频一区| 国产精品人人做人人爽| 久久影院资源站| 欧美一区二区三区艳史| 国产精品流白浆视频| 亚洲奶大毛多的老太婆| 亚洲新中文字幕| 亚洲精品白浆高清久久久久久| 高清亚洲成在人网站天堂| 欧美日韩国产精品一区| 国产精品国内视频| 中文字幕亚洲在线| 蜜臀久久99精品久久久久久宅男| 欧美二区在线播放| xvideos成人免费中文版| 日韩免费观看视频| 日韩精品久久久久久久玫瑰园| 亚洲欧美一区二区激情| 欧美午夜激情在线| 亚洲aⅴ日韩av电影在线观看| 精品久久久久久久久中文字幕| 亚洲欧洲美洲在线综合| 最近中文字幕mv在线一区二区三区四区| 欧美大片免费观看在线观看网站推荐| 精品免费在线视频| 97婷婷大伊香蕉精品视频| 日韩高清有码在线| 国产欧美日韩专区发布| www国产精品视频| 亚洲精品福利免费在线观看| 国产高清视频一区三区| 国产小视频91| 精品久久久久久久久久久久| 日韩亚洲成人av在线| 久久精品国产精品| 亚洲在线一区二区| 日本午夜在线亚洲.国产| 国产偷国产偷亚洲清高网站| 欧美性20hd另类| 最近的2019中文字幕免费一页| 国产一区二区三区在线播放免费观看| 久久香蕉精品香蕉| 亚洲精品国产美女| 欧美激情精品久久久久久免费印度| 亚洲欧美国产精品va在线观看| 精品国产区一区二区三区在线观看| 国产精品国语对白| 日韩av第一页| 国产精品国语对白| 久久av中文字幕| 国产裸体写真av一区二区| 欧美精品激情在线观看| 国产91av在线| 日韩小视频在线观看| 日韩精品免费在线播放| 91精品久久久久久久久不口人| 国产精品综合网站| 亚洲精品女av网站| 日韩高清有码在线| 播播国产欧美激情| 国产精品第二页| 狠狠躁夜夜躁人人躁婷婷91| 欧美国产亚洲视频| 日韩在线资源网| 亚洲国产天堂久久综合网| 欧美日韩免费看| 一区二区三区 在线观看视| 久久久999国产| 欧美一级高清免费| 亚洲国产日韩欧美在线99| 色偷偷噜噜噜亚洲男人的天堂| 日韩美女在线看| 国产69精品99久久久久久宅男| 欧美黑人巨大精品一区二区| 国精产品一区一区三区有限在线| 欧美多人乱p欧美4p久久| 久久精视频免费在线久久完整在线看| 国外成人在线播放| 97视频在线观看网址| 日本免费久久高清视频| 中文字幕一区电影| 亚洲最大的成人网| 在线精品视频视频中文字幕| 国产亚洲精品高潮| 亚洲日韩欧美视频一区| 日本三级久久久| 久久久久中文字幕| 欧美性xxxx18| 91网站在线看| 亚洲男人的天堂网站| 热99在线视频| 亚洲精品福利视频| 久久伊人91精品综合网站| 中文字幕欧美在线| 成人字幕网zmw| 欧美性受xxx| 亚洲韩国欧洲国产日产av| 成人深夜直播免费观看| 亚洲天堂男人天堂| 国产婷婷成人久久av免费高清| 欧洲s码亚洲m码精品一区| 欧美国产一区二区三区| 亚洲伦理中文字幕| 久久久国产视频| 欧美猛男性生活免费| 欧美成年人视频网站| 亚洲欧美变态国产另类| 久久久极品av| 亚洲人成77777在线观看网| 欧美专区国产专区| 久久精品电影网| 一本色道久久88综合亚洲精品ⅰ| 久久久久国产精品免费网站| 国产精品h片在线播放| 亚洲第一偷拍网| 日韩精品极品视频免费观看| 欧美色视频日本高清在线观看| 国产国产精品人在线视| 26uuu另类亚洲欧美日本老年| 亚洲成av人乱码色午夜| 国产精品久久色| 国产精品黄页免费高清在线观看| 欧美精品久久久久久久免费观看| 国产精品极品在线| 亚洲综合中文字幕在线观看| 亚洲网在线观看| 亚洲欧洲av一区二区| 97碰在线观看| 国产精品福利久久久| 欧美一区二粉嫩精品国产一线天| 日韩久久免费视频| 欧美激情影音先锋| 成人xxxxx| 国产成人久久精品| 久久久精品影院| 综合网日日天干夜夜久久|