国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當前位置: 首頁 - 科技 - 知識百科 - 正文

React如何避免重渲染

來源:懂視網 責編:小采 時間:2020-11-27 22:16:43
文檔

React如何避免重渲染

React如何避免重渲染:組件的重新渲染 我們可以在 React 組件中的 props 和 state 存放任何類型的數據,通過改變 props 和 state,去控制整個組件的狀態。當 props 和 state 發生變化時,React 會重新渲染整個組件,組件重新渲染的過程可簡化如下圖: 譯者之前對diff的理解
推薦度:
導讀React如何避免重渲染:組件的重新渲染 我們可以在 React 組件中的 props 和 state 存放任何類型的數據,通過改變 props 和 state,去控制整個組件的狀態。當 props 和 state 發生變化時,React 會重新渲染整個組件,組件重新渲染的過程可簡化如下圖: 譯者之前對diff的理解

組件的重新渲染

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

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

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

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

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

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

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

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的項,且會報一個警告。

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

React如何避免重渲染

React如何避免重渲染:組件的重新渲染 我們可以在 React 組件中的 props 和 state 存放任何類型的數據,通過改變 props 和 state,去控制整個組件的狀態。當 props 和 state 發生變化時,React 會重新渲染整個組件,組件重新渲染的過程可簡化如下圖: 譯者之前對diff的理解
推薦度:
  • 熱門焦點

最新推薦

猜你喜歡

熱門推薦

專題
Top
主站蜘蛛池模板: 国产精品成人久久久久久久 | 亚洲 自拍 另类 欧美 综合 | 欧美三级经典电影在线观看 | 欧美日韩国产片 | 久久综合中文字幕一区二区 | 色在线免费视频 | 香蕉乱码成人久久天堂爱免费 | 国产一区精品在线观看 | 黄色免费网站视频 | 国产精品高清视亚洲一区二区 | 欧美高清在线不卡免费观看 | xx中文字幕乱偷avxx | 欧美日韩视频 | 欧美性xxxxxx爱 | 人善交另类欧美重口另类 | 国产欧美久久久精品影院 | 九九热国产 | 一区二区三区中文字幕 | 伊人婷婷| 亚洲欧美一区二区三区孕妇 | 亚洲精品乱码久久久久久中文字幕 | 多人伦精品一区二区三区视频 | 亚洲一区二区三区高清 不卡 | 欧美视频在线观看免费 | 亚洲国产系列一区二区三区 | 日韩在线第三页 | 自拍偷拍亚洲区 | 欧美极品欧美精品欧美视频 | 日韩专区第一页 | 日韩在线综合 | 曰韩三级| 亚洲综合欧美在线 | 国产精品免费播放 | 国产日韩欧美综合在线 | 五月天中文字幕 | 国产欧美日本亚洲精品五区 | 亚洲国产精品成人综合久久久 | 一区二区影视 | 欧美综合自拍亚洲综合 | 亚洲国产日韩欧美 | 欧美精品三区 |