最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Component與PureComponent對比解析

 更新時間:2023年03月01日 12:01:33   作者:別哭0摸摸頭  
這篇文章主要為大家介紹了Component與PureComponent解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

題外話

有啥不對的請多多指教,研究的不算很深,記錄為了分享,也為了博采眾長,完善知識。

官方文檔

React.PureComponent 與 React.Component很相似。兩者的區(qū)別在于 React.Component 并未實現(xiàn) shouldComponentUpdate(),而 React.PureComponent 中以淺層對比 prop 和 state 的方式來實現(xiàn)了該函數(shù)。

官方解釋也很容易理解,React.PureComponentReact.Component中多實現(xiàn)了一個方法,就導(dǎo)致了在組件數(shù)據(jù)發(fā)生變化時,React.PureComponent會先進(jìn)行和上一次的比較,如果相同,就不會再繼續(xù)更新了。

口說無憑,還是得通過代碼來體會。

對比

先看兩者相同得地方 代碼如下

class Box1 extends React.Component {
  render() {
    console.log('Box1 update');
    return <div>Box1: {this.props.count}</div>;
  }
}
class Box2 extends React.PureComponent {
  render() {
    console.log('Box2 update');
    return <div>Box2: {this.props.count}</div>;
  }
}

先制作2個對比的組件Box1與Box2, 然后制作一個父組件引入其中,并設(shè)置一個方法

export default () => {
  const [count, setCount] = React.useState(1);
  console.log('parent update');
  return (
    <div>
      <Box1 count={count}/>
      <Box2 count={count}/>
      <button onClick={() => setCount(count + 1)}>+1</button>
    </div>
  );
};

此時,點擊button按鈕的時候,上述2個Box組件都會進(jìn)行更新。

這也是最基礎(chǔ)的組件更新。

取消外部數(shù)據(jù)引入

class Box1 extends React.Component {
  render() {
    console.log('Box1 update');
    return <div>Box1</div>;
  }
}
class Box2 extends React.PureComponent {
  render() {
    console.log('Box2 update');
    return <div>Box2</div>;
  }
}
export default () => {
  const [count, setCount] = React.useState(1);
  console.log('parent update');
  return (
    <div>
      <Box1 />
      <Box2 />
      <button onClick={() => setCount(count + 1)}>+1</button>
    </div>
  );
};

取消Box組件內(nèi)對外部count的引入

此時頁面更新為

此時會發(fā)現(xiàn)只有Box1重新刷新了一遍,而Box2未重新加載組件,也就是PureComponent內(nèi)部做了淺比較相同的不會進(jìn)行更新。

為什么被稱為淺比較

淺比較是指對值類型進(jìn)行比較,而稍微復(fù)雜一點的引用類型(Object),就無法進(jìn)行判斷了,react內(nèi)部的更新都是淺比較。

export default () => {
  const [count, setCount] = React.useState({ num: 1 });
  console.log('parent update');
  const click = () => {
    const newCount = count;
    newCount.num = count.num + 1;
    setCount(newCount);
    console.log('update:', count)
  };
  return (
    <div>
      <Box1 />
      <Box2 />
      <button onClick={click}>+1</button>
    </div>
  );
};

此時,父組件內(nèi)部的count為對象類型,此時進(jìn)行更新時,頁面不會觸發(fā)任何更新,父組件也不會進(jìn)行刷新(由于是引用類型,newCount發(fā)生數(shù)據(jù)變化時,count其實已經(jīng)發(fā)生變化,但是頁面并不會有任何的反應(yīng))。

由圖可見,子組件和父組件并沒有進(jìn)行刷新,均未打印。

小知識點

const的不可變定義也是只對于值類型而言,對于引用類型,還是依然可變。上述代碼云清并不會報錯。

說明

上述的一切代碼都是建立在父組件自身更新的基礎(chǔ)上子組件才會刷新,如果我將setCount(count + 1)改為setCount(count + 0),那么,父組件本身不會進(jìn)行刷新,子組件也就理所當(dāng)然的不會有任何變化。

另類的不更新

這里的父組件刷新帶動子組件刷新有一種例外的情況。代碼如下

const Parent = ({ children }) => {
  const [count, setCount] = React.useState(1);

  console.log('parent update');
  return (
    <div>
      {children}
      <button onClick={() => setCount(count + 1)}>box2</button>
    </div>
  );
};

export default () => {
  return (
    <Parent>
      <Box1 />
      <Box2 />
    </Parent>
  );
};

將父組件抽離出來,子組件以children的形式引入。 此時頁面點擊發(fā)生的變化為

會發(fā)現(xiàn)不管怎么點擊,只有Parent組件進(jìn)行刷新,子組件全部都毫無反應(yīng)。

這個原因我不得而知,可能是因為react生成dom的時候問題,這個等待深入學(xué)習(xí)后再來解答。

總結(jié)

PureComponent多用于抽取本地緩存制作的下拉框組件或者是根據(jù)數(shù)據(jù)字典生成的展示組件,這種固定的組件基本在用戶使用時不會有任何的變化,只在登錄和頁面加載最開始生成。

以上就是Component與PureComponent解析的詳細(xì)內(nèi)容,更多關(guān)于Component PureComponent解析的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 詳解react-webpack2-熱模塊替換[HMR]

    詳解react-webpack2-熱模塊替換[HMR]

    這篇文章主要介紹了詳解react-webpack2-熱模塊替換[HMR], 小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • React+ResizeObserver實現(xiàn)自適應(yīng)ECharts圖表

    React+ResizeObserver實現(xiàn)自適應(yīng)ECharts圖表

    ResizeObserver是JavaScript的一個API,用于監(jiān)測元素的大小變化,本文主要為大家介紹了React如何利用ResizeObserver實現(xiàn)自適應(yīng)ECharts圖表,需要的可以參考下
    2024-01-01
  • React受控組件和非受控組件對比詳解

    React受控組件和非受控組件對比詳解

    在使用React搭建用戶界面時,組件可以分為兩類:受控組件和費受控組件這兩種組件在數(shù)據(jù)處理方式上有著顯著的差異,理解它們的區(qū)別對于構(gòu)建高效和可控的React應(yīng)用至關(guān)重要,本文將深入探討這兩種組件的定義、特點以及使用場景,并通過示例代碼幫助你更加清晰地理解它們
    2025-01-01
  • React中useState原理的代碼簡單實現(xiàn)

    React中useState原理的代碼簡單實現(xiàn)

    要實現(xiàn)useState的背后原理,則需要深入了解狀態(tài)是如何在函數(shù)組件的渲染周期中保持和更新的,本文將通過一段代碼簡單闡述useState鉤子函數(shù)的實現(xiàn)思路,希望對大家有所幫助
    2023-12-12
  • React中條件渲染的常見方法總結(jié)

    React中條件渲染的常見方法總結(jié)

    條件渲染在React開發(fā)中非常重要的功能,它允許開發(fā)人員根據(jù)條件控制渲染的內(nèi)容,在創(chuàng)建動態(tài)和交互式用戶界面方面發(fā)揮著至關(guān)重要的作用,本文總結(jié)了常用的的條件渲染方法,需要的朋友可以參考下
    2024-01-01
  • React?Router?v6路由懶加載的2種方式小結(jié)

    React?Router?v6路由懶加載的2種方式小結(jié)

    React?Router?v6?的路由懶加載有2種實現(xiàn)方式,1是使用react-router自帶的?route.lazy,2是使用React自帶的?React.lazy,下面我們就來看看它們的具體實現(xiàn)方法吧
    2024-04-04
  • React中ES5與ES6寫法的區(qū)別總結(jié)

    React中ES5與ES6寫法的區(qū)別總結(jié)

    這篇文章主要總結(jié)介紹了關(guān)于React中ES5與ES6的寫法區(qū)別,文中介紹的非常詳細(xì),相信對大家具有一定的參考價值,需要的朋友們下面來一起看看吧。
    2017-04-04
  • 詳解React Hooks是如何工作的

    詳解React Hooks是如何工作的

    React Hooks是在React 16.8版本新增的特性,在我看了React官網(wǎng)和一些博客對React Hook的講解后還是覺得沒有g(shù)et到本質(zhì)。本篇博客通過手動實現(xiàn)useState()來了解Hook的原理和本質(zhì)。閱讀此篇博客的前提是你要知道一些 React Hooks的基本用法和使用規(guī)則,不然會看得云里霧里。
    2021-05-05
  • react使用CSS實現(xiàn)react動畫功能示例

    react使用CSS實現(xiàn)react動畫功能示例

    這篇文章主要介紹了react使用CSS實現(xiàn)react動畫功能,結(jié)合實例形式分析了react使用CSS實現(xiàn)react動畫功能具體步驟與實現(xiàn)方法,需要的朋友可以參考下
    2020-05-05
  • 全棧輕量級搭配之Remix Prisma Sqlite使用分析

    全棧輕量級搭配之Remix Prisma Sqlite使用分析

    這篇文章主要為大家介紹了全棧輕量級搭配之Remix Prisma Sqlite使用示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05

最新評論

井研县| 克拉玛依市| 青浦区| 格尔木市| 白朗县| 西丰县| 扎鲁特旗| 汶上县| 忻城县| 南澳县| 上高县| 东宁县| 闽侯县| 虹口区| 基隆市| 鞍山市| 云龙县| 汕头市| 宁波市| 武强县| 长寿区| 温州市| 治多县| 新和县| 楚雄市| 木兰县| 天津市| 平南县| 十堰市| 密云县| 唐河县| 临海市| 澄江县| 丹东市| 韶山市| 玛曲县| 涪陵区| 肃南| 千阳县| 祁阳县| 拜城县|