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

首頁 > 開發 > JS > 正文

React之PureComponent的使用作用

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

React避免重復渲染

React在渲染出的UI內部建立和維護了一個內層的實現方式,它包括了從組件返回的React元素。這種實現方式使得React避免了一些不必要的創建和關聯DOM節點,因為這樣做可能比直接操作JavaScript對象更慢一些,它被稱之為“虛擬DOM”。

當一個組件的props或者state改變時,React通過比較新返回的元素和之前渲染的元素來決定是否有必要更新實際的DOM。當他們不相等時,React會更新DOM。

在一些情況下,你的組件可以通過重寫這個生命周期函數shouldComponentUpdate來提升速度, 它是在重新渲染過程開始前觸發的。 這個函數默認返回true,可使React執行更新:

shouldComponentUpdate(nextProps, nextState) { return true;}

舉例

如果想讓組件只在props.color或者state.count的值變化時重新渲染,你可以像下面這樣設定shouldComponentUpdate

class CounterButton extends React.Component { constructor(props) {  super(props);  this.state = {count: 1}; } shouldComponentUpdate(nextProps, nextState) {  if (this.props.color !== nextProps.color) {   return true;  }  if (this.state.count !== nextState.count) {   return true;  }  return false; } render() {  return (   <button    color={this.props.color}    onClick={() => this.setState(state => ({count: state.count + 1}))}>    Count: {this.state.count}   </button>  ); }}

在以上代碼中,shouldComponentUpdate只檢查props.colorstate.count的變化。如果這些值沒有變化,組件就不會更新。當你的組件變得更加復雜時,你可以使用類似的模式來做一個“淺比較”,用來比較屬性和值以判定是否需要更新組件。這種模式十分常見,因此React提供了一個輔助對象來實現這個邏輯 - 繼承自React.PureComponent。以下代碼可以更簡單的實現相同的操作:

class CounterButton extends React.PureComponent { constructor(props) {  super(props);  this.state = {count: 1}; } render() {  return (   <button    color={this.props.color}    onClick={() => this.setState(state => ({count: state.count + 1}))}>    Count: {this.state.count}   </button>  ); }}

PureComponent

原理

當組件更新時,如果組件的 props 和 state 都沒發生改變, render 方法就不會觸發,省去 Virtual DOM 的生成和比對過程,達到提升性能的目的。具體就是 React 自動幫我們做了一層淺比較:

if (this._compositeType === CompositeTypes.PureClass) {  shouldUpdate = !shallowEqual(prevProps, nextProps) || !shallowEqual(inst.state, nextState);}

而 shallowEqual 又做了什么呢?會比較 Object.keys(state | props) 的長度是否一致,每一個 key 是否兩者都有,并且是否是一個引用,也就是只比較了第一層的值,確實很淺,所以深層的嵌套數據是對比不出來的。

問題

大部分情況下,你可以使用React.PureComponent而不必寫你自己的shouldComponentUpdate,它只做一個淺比較。但是由于淺比較會忽略屬性或狀態突變的情況,此時你不能使用它。

class ListOfWords extends React.PureComponent { render() {  return <div>{this.props.words.join(',')}</div>; }}class WordAdder extends React.Component { constructor(props) {  super(props);  this.state = {   words: ['marklar']  };  this.handleClick = this.handleClick.bind(this); } handleClick() {  // This section is bad style and causes a bug  const words = this.state.words;  words.push('marklar');  this.setState({words: words}); } render() {  return (   <div>    <button onClick={this.handleClick} />    <ListOfWords words={this.state.words} />   </div>  ); }}

在ListOfWords中,this.props.words是WordAdder中傳入的其state的一個引用。雖然在WordAdder的handelClick方法中被改變了,但是對于ListOfWords來說,其引用是不變的,從而導致并沒有被更新。

解決方法

在上面的問題中可以發現,當一個數據是不變數據時,可以使用一個引用。但是對于一個易變數據來說,不能使用引用的方式給到PureComponent。簡單來說,就是我們在PureComponent外層來修改其使用的數據時,應該給其賦值一個新的對象或者引用,從而才能確保其能夠進行重新渲染。例如上面例子中的handleClick可以通過以下幾種來進行修改從而確認正確的渲染:

handleClick() { this.setState(prevState => ({  words: prevState.words.concat(['marklar']) }));}

或者

handleClick() { this.setState(prevState => ({  words: [...prevState.words, 'marklar'], }));};

或者針對對象結構:

function updateColorMap(oldObj) { return Object.assign({}, oldObj, {key: new value});}

immutable.js

Immutable.js是解決這個問題的另一種方法。它通過結構共享提供不可突變的,持久的集合:

  • 不可突變:一旦創建,集合就不能在另一個時間點改變。
  • 持久性:可以使用原始集合和一個突變來創建新的集合。原始集合在新集合創建后仍然可用。
  • 結構共享:新集合盡可能多的使用原始集合的結構來創建,以便將復制操作降至最少從而提升性能。
// 常見的js處理const x = { foo: 'bar' };const y = x;y.foo = 'baz';x === y; // true// 使用 immutable.jsconst SomeRecord = Immutable.Record({ foo: null });const x = new SomeRecord({ foo: 'bar' });const y = x.set('foo', 'baz');x === y; // false

總結

PureComponent 真正起作用的,只是在一些純展示組件上,復雜組件使用的話shallowEqual 那一關基本就過不了。另外在使用的過程中為了確保能夠正確的渲染,記得 props 和 state 不能使用同一個引用哦。

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


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久精品国产久精国产一老狼| 欧美大片在线免费观看| 中文字幕国内精品| 国产精品丝袜久久久久久不卡| 成人免费网站在线看| 伊是香蕉大人久久| 91久久在线观看| 日韩欧美在线视频日韩欧美在线视频| 红桃视频成人在线观看| 成人激情春色网| 97香蕉超级碰碰久久免费软件| 欧美日韩ab片| 国产一区二区精品丝袜| 亚洲四色影视在线观看| 狠狠躁夜夜躁人人爽天天天天97| 欧美一级片久久久久久久| 精品国产一区二区三区久久久| 7777精品视频| 91精品国产乱码久久久久久久久| 自拍偷拍亚洲在线| 成人黄色短视频在线观看| 成人久久一区二区三区| 精品久久久久久久大神国产| 欧美成人免费播放| 日本三级韩国三级久久| 青青精品视频播放| 91精品国产网站| 国产日韩在线免费| 国产色视频一区| 国模精品一区二区三区色天香| 亚洲视频自拍偷拍| 国产精品对白刺激| 久久久久久久电影一区| 久久久精品影院| 欧美激情乱人伦| 日本在线观看天堂男亚洲| 日本亚洲欧美三级| 亚洲www永久成人夜色| 日韩欧亚中文在线| 国产精品高潮呻吟视频| 57pao精品| 国产日产亚洲精品| 午夜精品在线视频| 日韩精品亚洲元码| 欲色天天网综合久久| 国产主播欧美精品| 亚洲一区二区久久久久久久| 45www国产精品网站| 亚洲跨种族黑人xxx| 91九色国产在线| 茄子视频成人在线| 亚洲日韩欧美视频| 亚洲精品狠狠操| 亚洲最大激情中文字幕| 亚洲自拍偷拍第一页| 亚洲性视频网站| 亚洲欧洲在线看| 欧美黑人性生活视频| 国产一区二区三区高清在线观看| 久久精品视频导航| 亚洲精品美女网站| 亚洲一区二区福利| 久久久国产视频91| 成人网在线观看| 国产日韩欧美在线| 色噜噜狠狠狠综合曰曰曰| 亚洲白拍色综合图区| 久久精品国产久精国产思思| 色777狠狠综合秋免鲁丝| 日韩欧美成人网| 岛国av一区二区三区| 国产精品精品视频一区二区三区| 91精品国产91久久久久久久久| 国产一区二区黑人欧美xxxx| 午夜精品蜜臀一区二区三区免费| 亚洲字幕在线观看| 国产精品激情av在线播放| 91av视频导航| 中文字幕欧美国内| 欧美高清视频一区二区| 欧洲亚洲免费视频| 欧美成人精品三级在线观看| 精品久久香蕉国产线看观看亚洲| 97精品免费视频| 欧美成人黄色小视频| 国产欧美日韩中文| 久久人人爽亚洲精品天堂| 日韩精品亚洲视频| 91精品国产777在线观看| 欧美裸体xxxx极品少妇| 精品一区二区三区四区在线| 中文字幕精品影院| 欧美激情亚洲另类| 亚洲综合精品伊人久久| 国产精品一区二区久久久久| 精品亚洲一区二区三区| 综合网中文字幕| 久久精品国产综合| 97av在线视频| 亚洲精品第一页| 国产综合色香蕉精品| 亚洲一区二区在线| 国内精品久久久久久| 久久精品国产亚洲精品| 琪琪亚洲精品午夜在线| 国产午夜精品视频| 韩国三级日本三级少妇99| 欧美日韩国产一区二区| 亚洲资源在线看| 久久成年人视频| 69国产精品成人在线播放| 国产午夜精品美女视频明星a级| 欧美日韩亚洲一区二| 精品女同一区二区三区在线播放| 国产精品福利网站| 国产97色在线| 亚洲美女福利视频网站| 国产性色av一区二区| 91精品久久久久久久久青青| 国产欧美中文字幕| 国产亚洲成av人片在线观看桃| 亚洲欧美国产一本综合首页| 国产精品aaaa| 在线播放日韩精品| 国产一区二区在线播放| 亚洲第一av网站| 在线观看欧美日韩国产| 2019国产精品自在线拍国产不卡| 国产视频精品xxxx| 亚洲国产精品电影在线观看| 欧美日韩福利视频| 中文字幕亚洲欧美日韩2019| 欧美极品欧美精品欧美视频| 亚洲人成毛片在线播放| 欧美精品18videosex性欧美| 欧美日韩福利视频| www国产亚洲精品久久网站| 日韩美女免费线视频| www国产精品视频| 狠狠躁夜夜躁久久躁别揉| 日韩在线免费av| 欧美高清videos高潮hd| 国产精品h片在线播放| 亚洲成年网站在线观看| 不卡在线观看电视剧完整版| 日韩中文字幕免费| 97在线观看免费高清| 亚洲国产私拍精品国模在线观看| 成人精品一区二区三区电影黑人| 欧美黑人xxxⅹ高潮交| 国产精品私拍pans大尺度在线| 久久久999精品免费| 久久伊人精品一区二区三区| 丰满岳妇乱一区二区三区| 亚洲网站在线观看| 日韩动漫免费观看电视剧高清| 欧美在线xxx| 日韩在线免费高清视频| 欧美野外wwwxxx| 亚洲黄色av女优在线观看| 一本一本久久a久久精品牛牛影视| 久久久国产一区二区三区| 精品国产一区二区三区在线观看| 8x拔播拔播x8国产精品|