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

關(guān)于?React?中?useEffect?使用問題淺談

 更新時間:2022年06月27日 15:56:40   作者:dxh_hxd  
本文主要介紹了關(guān)于React中useEffect使用問題淺談,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

最近看了一下 ant-design 中的 tree 組件源碼時發(fā)現(xiàn) useEffect 中根據(jù) props 來計算當(dāng)前函數(shù)組件的 state 的,感到好奇,因為這樣會導(dǎo)致應(yīng)用重新繪制一次,這樣才復(fù)雜場景下會對應(yīng)用有一定的性能影響。為了驗證自己猜想是否正確做了一下實踐。這里的 React 是官方 16.12.0的源碼。

優(yōu)化前

import * as React from './react-source/packages/react'
import * as ReactDOM from './react-source/packages/react-dom'

const root = document.getElementById('root');

function Foo({number}) {
  const [number2, setNumber2] = React.useState(0);
  React.useEffect(() => {
    setNumber2( number + 1)
  }, [number])
  return <div>
   {number2 % 2 === 0 && <div>{number2}</div>}
    <button onClick={() => setNumber2(number2 + 1)}>更新 number2</button>
  </div>
}

function App() {
  const [number1,setNumber1] = React.useState(1);
  return <>
   {number1 % 2 === 0  &&  <div>{number1}</div>}
    <Foo number={number1}/>
    <button onClick={() => setNumber1(number1 + 1)}>更新 number1</button>
  </>
} 
ReactDOM.render(<App/>, root)

這里有兩個組件, APP 函數(shù)組件有一個 number1 的 state,并作用 Foo 函數(shù)組件的 number props傳遞給子組件。Foo 子組件在 useEffect 中 依賴 number 的變化來更新該組件的 number2 state。

為了監(jiān)聽 root 節(jié)點變化的情況我使用了 MutationObserver API 來看看監(jiān)聽回調(diào)函數(shù)執(zhí)行了多少次,所以在測試代碼中增加了如下代碼

const root = document.getElementById('root');
const observer = new MutationObserver(mutations =&gt; {
  console.log(mutations)
} )
observer.observe(root, {
  childList: true,
  subtree: true
})

來看一下第一渲染時界面輸出的效果

可以看到 MutationObserver 回調(diào)被執(zhí)行了兩次, mutations 中有兩項新增記錄,對應(yīng) root 的新增兩個子節(jié)點?,F(xiàn)在再看看我點【更新number1】按鈕之后的結(jié)果

可以看到 MutationObserver 這個回調(diào)被執(zhí)行了兩次,也就是但這個按鈕的時候頁面繪制了兩次。

優(yōu)化后

import * as React from './react-source/packages/react'
import * as ReactDOM from './react-source/packages/react-dom'

const root = document.getElementById('root');
const observer = new MutationObserver(mutations => {
  console.log(mutations)
} )
observer.observe(root, {
  childList: true,
  subtree: true
})


function Foo({number2,setNumber2}) {
  return <div>
   {number2 % 2 === 0 && <div>{number2}</div>}
    <button onClick={() => setNumber2(number2 + 1)}>更新 number2</button>
  </div>
}

function App() {
  const [number1,setNumber1] = React.useState(1);
  /**
   *  這里例子可能不太好,因為但從這里例子來看 number 沒必要再調(diào)用 
   *  useState,實際項目應(yīng)用場景中有的比較復(fù)雜的邏輯,狀態(tài)之間有關(guān)聯(lián)是
   *  比較常見的
   */
  const [number2, setNumber2] = React.useState(0);
  return <>
   {number1 % 2 === 0  &&  <div>{number1}</div>}
    <Foo number2={number2} setNumber2={setNumber2}/>
    <button onClick={() => {
        let newNumber1 = number1 + 1
       setNumber1(newNumber1)
       setNumber2(newNumber1 + 1)
    }}>更新 number1</button>
  </>
} 
ReactDOM.render(<App/>, root)

優(yōu)化有的代碼就是把 Foo 狀態(tài)提升到父組件中,然后把狀態(tài)以及更新函數(shù)傳給子組件就行。這樣我們再來看一下點擊【更新number1】之后的效果圖

可以看看到這次 MutationObserver 的回調(diào)只被執(zhí)行了一次。

總結(jié)

項目中還是盡量減少應(yīng)用的重復(fù)繪制次數(shù),不然會影響用戶的交互體驗,最差的情況可能還會看到每次繪制的中間狀態(tài),視覺上給人一種很卡的感覺。雖然性能提升上去了,但是代碼的可維護性變差了,這種的就看你怎么平衡了,如果性能如果能接受的話,個人還是感覺代碼的可維護性重要些。實踐的時候還發(fā)現(xiàn)了一個 MutationObserver 的一個問題,就是我對 DOM 節(jié)點的文本進行修改的時候,MutationObserver 的回調(diào)居然沒有執(zhí)行讓我有些意外。

到此這篇關(guān)于關(guān)于 React 中 useEffect 使用問題淺談的文章就介紹到這了,更多相關(guān)React useEffect 使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 關(guān)于react中useCallback的用法

    關(guān)于react中useCallback的用法

    這篇文章主要介紹了關(guān)于react中useCallback的用法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • React.js前端導(dǎo)出Excel的方式

    React.js前端導(dǎo)出Excel的方式

    這篇文章主要為大家介紹了React.js前端導(dǎo)出Excel的方式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • 使用useImperativeHandle時父組件第一次沒拿到子組件的問題

    使用useImperativeHandle時父組件第一次沒拿到子組件的問題

    這篇文章主要介紹了使用useImperativeHandle時父組件第一次沒拿到子組件的問題及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • React-Native之TextInput組件的設(shè)置以及如何獲取輸入框的內(nèi)容

    React-Native之TextInput組件的設(shè)置以及如何獲取輸入框的內(nèi)容

    這篇文章主要介紹了React-Native之TextInput組件的設(shè)置以及如何獲取輸入框的內(nèi)容問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • react如何快速設(shè)置文件路徑別名

    react如何快速設(shè)置文件路徑別名

    React是用于構(gòu)建用戶界面的JavaScript庫, 起源于Facebook的內(nèi)部項目,這篇文章主要介紹了react如何快速設(shè)置文件路徑別名,需要的朋友可以參考下
    2021-04-04
  • React 模塊聯(lián)邦多模塊項目實戰(zhàn)詳解

    React 模塊聯(lián)邦多模塊項目實戰(zhàn)詳解

    這篇文章主要介紹了React 模塊聯(lián)邦多模塊項目實戰(zhàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • React.js源碼解析setState流程

    React.js源碼解析setState流程

    這篇文章主要為大家介紹了React.js源碼解析setState流程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • 詳解如何使用Jest測試React組件

    詳解如何使用Jest測試React組件

    在本文中,我們將了解如何使用Jest(Facebook 維護的一個測試框架)來測試我們的React組件,我們將首先了解如何在純 JavaScript 函數(shù)上使用 Jest,然后再了解它提供的一些開箱即用的功能,這些功能專門用于使測試 React 應(yīng)用程序變得更容易,需要的朋友可以參考下
    2023-10-10
  • 基于React-Dropzone開發(fā)上傳組件功能(實例演示)

    基于React-Dropzone開發(fā)上傳組件功能(實例演示)

    這篇文章主要介紹了基于React-Dropzone開發(fā)上傳組件,主要講述的是在React-Flask框架上開發(fā)上傳組件的技巧,需要的朋友可以參考下
    2021-08-08
  • React系列useSyncExternalStore學(xué)習(xí)詳解

    React系列useSyncExternalStore學(xué)習(xí)詳解

    這篇文章主要為大家介紹了React系列useSyncExternalStore的學(xué)習(xí)及示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07

最新評論

长子县| 昌邑市| 安西县| 灌云县| 朔州市| 盈江县| 辽中县| 华容县| 松溪县| 定远县| 胶南市| 开鲁县| 贵溪市| 辽中县| 玉山县| 潞西市| 鄂温| 新龙县| 阜新市| 镇巴县| 诸暨市| 高尔夫| 蒲江县| 昭苏县| 贡嘎县| 锦屏县| 专栏| 福鼎市| 龙胜| 汤原县| 武川县| 康马县| 珠海市| 孝昌县| 张家口市| 南溪县| 云南省| 公安县| 永定县| 阿克苏市| 拜泉县|