亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

React中useEffect使用問題怎么解決

發布時間:2022-06-28 14:27:16 來源:億速云 閱讀:232 作者:iii 欄目:開發技術

本篇內容介紹了“React中useEffect使用問題怎么解決”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

前言

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

優化前

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 函數組件有一個 number1 的 state,并作用 Foo 函數組件的 number props傳遞給子組件。Foo 子組件在 useEffect 中 依賴 number 的變化來更新該組件的 number2 state。

為了監聽 root 節點變化的情況我使用了 MutationObserver API 來看看監聽回調函數執行了多少次,所以在測試代碼中增加了如下代碼

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

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

React中useEffect使用問題怎么解決

可以看到 MutationObserver 回調被執行了兩次, mutations 中有兩項新增記錄,對應 root 的新增兩個子節點。現在再看看我點【更新number1】按鈕之后的結果

React中useEffect使用問題怎么解決

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

優化后

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 沒必要再調用 
   *  useState,實際項目應用場景中有的比較復雜的邏輯,狀態之間有關聯是
   *  比較常見的
   */
  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)

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

React中useEffect使用問題怎么解決

“React中useEffect使用問題怎么解決”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

隆德县| 民乐县| 张家川| 齐齐哈尔市| 馆陶县| 大邑县| 隆化县| 鄂温| 尚义县| 石嘴山市| 布尔津县| 故城县| 鹿邑县| 呼和浩特市| 济南市| 洛川县| 新建县| 拉孜县| 罗田县| 凉山| 庆安县| 惠州市| 云阳县| 余庆县| 安泽县| 灵丘县| 壶关县| 延庆县| 江都市| 托克托县| 普兰店市| 阳高县| 新竹市| 宁南县| 济南市| 鞍山市| 西乡县| 伊川县| 城市| 自治县| 孝昌县|