useMemo——提高React性能的利器

一、什麼是useMemo

React中提供了一種優化組件性能的鉤子函數——useMemo。它可以幫助我們避免在每次渲染時都執行的昂貴計算。

useMemo鉤子函數接收兩個參數:計算函數和依賴項數組。計算函數會在渲染期間執行,依賴項數組中的值是用來比較的,如果某個依賴項發生變化,useMemo會重新計算數值。否則,它將返回上一次計算結果的值。

示例代碼:

  const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);

二、如何使用useMemo

1、需要優化渲染的函數

因為useMemo是一個可以計算複雜值的鉤子函數,所以只有當你的組件渲染的元素個數非常多或者需要進行複雜計算時,你才需要使用useMemo來進行性能優化。

示例代碼:

  function App() {
    const arr = [1,2,3,4,5];
    const memoizedArr = useMemo(() => {
      return arr.map(item => item * item)
    }, [arr]);

    return (
      <div>
        <ul>
          {memoizedArr.map(item => <li>{item}</li>)}
        </ul>
      </div>
    );
  }

2、依賴項數組使用

useMemo的第二個參數中傳遞的是一個依賴項數組。這個數組中傳遞的值會在每次渲染時與上次的值進行比較。只有當它們不同時,useMemo才會重新計算數值。

示例代碼:

  function App2() {
    const [count, setCount] = useState(0);

    const memoizedValue = useMemo(() => {
      const sum = Array.from({ length: count }, (_, index) => index + 1).reduce((a, b) => {
        return a + b;
      });
      return sum;
    }, [count]);

    return (
      <div>
        <h3>count:{count}</h3>
        <button onClick={() => setCount(count + 1)}>add count</button>
        <span>memoizedValue:{memoizedValue}</span>
      </div>
    );
  }

3、將useMemo用在useEffect中

useMemo還可以用來優化像useEffect這樣的副作用鉤子函數。下面的示例展示了如何使用useMemo來減少不必要的渲染。

示例代碼:

  function App3() {
    const [count, setCount] = useState(0);
    const [step, setStep] = useState(1);

    const memoizedValue = useMemo(() => ({ count }), [count]);

    useEffect(() => {
      console.log('count:', count);
    }, [memoizedValue]);

    return (
      <div>
        <h3>count:{count}</h3>
        <h3>step:{step}</h3>
        <button onClick={() => setCount(count + step)}>add count</button>
        <button onClick={() => setStep(step + 1)}>add step</button>
      </div>
    );
  }

三、useMemo使用的常見錯誤

1、忽略依賴項

為了使useMemo正常工作,必須在第二個參數中傳遞所有相關的依賴項。如果忽略了一個重要的依賴項,則useMemo將不會執行預期的更新操作。

示例代碼:

  function App4() {
    const [count, setCount] = useState(0);
    const [step, setStep] = useState(1);

    const memoizedValue = useMemo(() => {
      const sum = Array.from({ length: count }, (_, index) => index + 1).reduce((a, b) => {
        return a + b;
      });
      return sum;
    }, []); // 這裡忽略了count,所以memoizedValue永遠不會變化

    return (
      <div>
        <h3>count:{count}</h3>
        <h3>step:{step}</h3>
        <button onClick={() => setCount(count + step)}>add count</button>
        <button onClick={() => setStep(step + 1)}>add step</button>
        <span>memoizedValue:{memoizedValue}</span>
      </div>
    );
  }

2、過度使用useMemo

雖然useMemo可以優化組件的性能,但是過度使用它會導致代碼更加複雜。有時候,完全沒有必要優化某些計算,因為它們的成本非常低。

示例代碼:

  function App5() {
    const [count, setCount] = useState(0);

    // count的平方數
    const memoizedValue = useMemo(() => {
      return count ** 2;
    }, [count]);

    // 僅僅只是count的顯示
    const memoizedValue2 = useMemo(() => {
      return `count:${count}`;
    }, [count]);

    return (
      <div>
        <h3>{memoizedValue2}</h3>
        <p>memoizedValue:{memoizedValue}</p>
        <button onClick={() => setCount(count + 1)}>add count</button>
      </div>
    );
  }

四、總結

useMemo是一個非常有用的鉤子函數,可以幫助我們在React應用程序中提高性能。但是,如果不適當地使用它,會導致代碼變得更加難以閱讀和理解。因此,在使用useMemo之前,請仔細考慮您要優化的值是否真的太昂貴,是否需要優化。

原創文章,作者:IDOCK,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/371633.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
IDOCK的頭像IDOCK
上一篇 2025-04-23 18:08
下一篇 2025-04-23 18:08

相關推薦

  • @uiw/react-amap介紹

    本文將詳細闡述@uiw/react-amap的使用方法和參數配置,以及如何在React應用中集成高德地圖組件。 一、@uiw/react-amap簡介 @uiw/react-ama…

    編程 2025-04-29
  • lsw2u1:全能編程開發工程師的利器

    lsw2u1是一款多功能工具,可以為全能編程開發工程師提供便利的支持。本文將從多個方面對lsw2u1做詳細闡述,並給出對應代碼示例。 一、快速存取代碼段 在日常開發中,我們總會使用…

    編程 2025-04-29
  • Python刷課:優化學習體驗的利器

    Python刷課作為一種利用自動化技術優化學習體驗的工具已經被廣泛應用。它可以幫助用戶自動登錄、自動答題等,讓用戶在學習過程中可以更加專註於知識本身,提高效率,增加學習樂趣。 一、…

    編程 2025-04-29
  • 如何優化 Git 性能和重構

    本文將提供一些有用的提示和技巧來優化 Git 性能並重構代碼。Git 是一個非常流行的版本控制系統,但是在處理大型代碼倉庫時可能會有一些性能問題。如果你正在處理這樣的問題,本文將會…

    編程 2025-04-29
  • 使用@Transactional和分表優化數據交易系統的性能和可靠性

    本文將詳細介紹如何使用@Transactional和分表技術來優化數據交易系統的性能和可靠性。 一、@Transactional的作用 @Transactional是Spring框…

    編程 2025-04-28
  • HBuilder2.0:一站式開發利器

    本文將從如下幾個方面對HBuilder2.0進行詳細闡述,幫助初學者快速了解並開始使用該工具: 一、簡介 HBuilder2.0是一個跨平台的HTML5集成開發工具。它綜合了編碼、…

    編程 2025-04-28
  • Powersploit:安全評估與滲透測試的利器

    本文將重點介紹Powersploit,並給出相關的完整的代碼示例,幫助安全人員更好地運用Powersploit進行安全評估和滲透測試。 一、Powersploit簡介 Powers…

    編程 2025-04-28
  • Python性能優化方案

    本文將從多個方面介紹Python性能優化方案,並提供相應的示例代碼。 一、使用Cython擴展 Cython是一個Python編譯器,可以將Python代碼轉化為C代碼,可顯著提高…

    編程 2025-04-28
  • JL Transaction – 實現分散式事務管理的利器

    本文將為大家介紹JL Transaction,這是一款可以實現分散式事務管理的開源事務框架,它可以幫助企業在分散式環境下有效地解決事務的一致性問題,從而保障系統的穩定性和可靠性。 …

    編程 2025-04-28
  • Python AUC:模型性能評估的重要指標

    Python AUC是一種用於評估建立機器學習模型性能的重要指標。通過計算ROC曲線下的面積,AUC可以很好地衡量模型對正負樣本的區分能力,從而指導模型的調參和選擇。 一、AUC的…

    編程 2025-04-28

發表回復

登錄後才能評論