• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答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之PureComponent的使用作用

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

    React之PureComponent的使用作用

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

    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.js
    
    const SomeRecord = Immutable.Record({ foo: null });
    const x = new SomeRecord({ foo: 'bar' });
    const y = x.set('foo', 'baz');
    x === y; // false
    
    

    總結

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

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

    文檔

    React之PureComponent的使用作用

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

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 国产精品视频九九九| 无码人妻精品一区二区三区99仓本| 精品国产毛片一区二区无码| 国产精品水嫩水嫩| 日韩精品欧美亚洲| 成人午夜精品久久久久久久小说 | 久久精品国产99国产精偷| 色一乱一伦一图一区二区精品| 久久精品亚洲精品国产欧美| 国产成人精品a视频一区 | 欧美精品xxxxbbbb| 国产精品亚洲产品一区二区三区| 久久成人国产精品二三区| 成人区人妻精品一区二区不卡视频 | 国产亚洲美女精品久久久| 国产精品久久久久久福利69堂| 人妻精品久久无码区| 伊人久久综合精品无码AV专区| 欧美成人精品第一区二区三区 | 2022国内精品免费福利视频| 久久久无码精品亚洲日韩按摩| 亚洲国产另类久久久精品小说| 欧美成人精品欧美一级乱黄一区二区精品在线| 欧美日韩精品在线| 久久国产精品久久精品国产| 2020国产精品永久在线| 精品国产一区二区三区久久久狼| 亚洲乱码国产乱码精品精| 亚洲国产精品人人做人人爱| 久久久精品无码专区不卡| 国产一区精品| 精品国产呦系列在线观看免费| 99久久精品免费看国产| 亚洲精品自产拍在线观看动漫| 99re久久精品国产首页2020| 99久久人妻无码精品系列| 久久精品国产精品亚洲艾草网美妙| 国产欧美日本亚洲精品一5| 高清在线国产午夜精品| 国产99视频精品专区| 国产精品亚洲美女久久久 |