欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

React中useCallback 的基本使用和原理小結

 更新時間:2025年11月05日 08:31:01   作者:老李說技術  
React的useCallback Hook用于緩存函數定義,避免組件重渲染時重復創(chuàng)建函數實例,本文就來介紹一下React 中 useCallback 的基本使用和原理,感興趣的可以了解一下

useCallback 是 React 的一個核心 Hook,用于?緩存函數定義?,避免組件重新渲染時重復創(chuàng)建函數實例。以下是其基本使用方法:

1. 基本語法

const memoizedCallback = useCallback(
  () => {
    // 函數邏輯 (例如更新狀態(tài)、調用API等)
    doSomething(a, b);
  },
  [a, b] // 依賴項數組
);
  • ?第一個參數?:需要緩存的函數。
  • ?第二個參數?:依賴項數組(Dependency Array),當數組中的變量變化時,函數會重新創(chuàng)建。

2. 核心作用

  • ?避免不必要的函數重建?:默認情況下,組件每次渲染都會創(chuàng)建新的函數實例,使用 useCallback 后可復用函數。
  • ?優(yōu)化子組件渲染?:當緩存的函數作為 props 傳遞給子組件(配合 React.memo)時,可避免子組件不必要的重渲染?。

3. 使用示例

import React, { useState, useCallback } from 'react';

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

  // 緩存函數:依賴項為空數組,函數只創(chuàng)建一次
  const increment = useCallback(() => {
    setCount(prev => prev + 1); // 使用函數式更新避免閉包問題
  }, []);

  return (
    <div>
      <p>Count: {count}</p>
      <button onClick={increment}>+1</button>
    </div>
  );
}
  • 依賴項 [] 表示函數僅在組件初次渲染時創(chuàng)建。
  • 使用 setCount(prev => prev + 1) 替代 setCount(count + 1) 可避免閉包陷阱(函數捕獲過時狀態(tài))?。

4. 適用場景

useCallback,本質上是用于緩存函數。

如果函數,是以props的方式,傳遞給子組件,為了每次避免子組件的渲染,建議使用useCallback進行包裹。

但是每一次,使用useCallback,我們考慮的首要問題是,這樣真的優(yōu)化了組件的性能嗎?其實大多數場景,如果不是類似列表渲染的場景,這樣不一定會優(yōu)化了性能。

也就是,函數作為props傳遞給性能敏感的子組件的場景,才是使用useCallback的時候。

useCallback的原理解析

  • useCallback 的主要目的是在依賴項不變的情況下,返回同一個函數引用,避免函數重復創(chuàng)建,從而優(yōu)化性能。
  • useCallback它會在首次渲染時(或依賴項變化時)創(chuàng)建一個新的函數,并將其緩存起來。在后續(xù)渲染中,如果依賴項沒有變化,則返回緩存的函數;否則,就重新創(chuàng)建函數并更新緩存。
  • 簡易的偽代碼,可能如下所示
let lastDeps; // 上一次的依賴項
let lastCallback; // 上一次緩存的函數

function useCallback(callback, deps) {
  if (lastDeps === undefined) {
    // 第一次調用
    lastDeps = deps;
    lastCallback = callback;
    return callback;
  }

  // 檢查依賴項是否變化
  const hasChanged = deps.some((dep, index) => dep !== lastDeps[index]);
  if (hasChanged) {
    lastDeps = deps;
    lastCallback = callback;
  }
  return lastCallback;
}

每次掉用useCallback,返回的函數,取決于依賴項有沒有發(fā)生變化。

React內部是咋樣的呢?

1、Fiber 節(jié)點存儲機制

React 在 Fiber 節(jié)點(組件實例對應的數據結構)中維護一個 memorizedState 鏈表,專門存儲 Hooks 狀態(tài)。

function updateCallback(callback, deps) {
  const hook = updateWorkInProgressHook(); // 獲取當前 Hook 節(jié)點
  const nextDeps = deps === undefined ? null : deps;
  const prevState = hook.memoizedState;     // 讀取緩存的上次狀態(tài)
  
  // 依賴項對比:使用淺比較(shallow equal)
  if (prevState !== null && areHookInputsEqual(nextDeps, prevState[1])) {
    return prevState[0]; // 返回緩存的函數
  }
  
  //  依賴變化:緩存新函數
  hook.memoizedState = [callback, nextDeps];
  return callback;
}

2、依賴項對比算法

源碼中的 areHookInputsEqual 對依賴數組進行淺比較(類似 Object.is):

function areHookInputsEqual(nextDeps, prevDeps) {
  if (prevDeps === null) return false;
  for (let i = 0; i < prevDeps.length; i++) {
    if (!Object.is(nextDeps[i], prevDeps[i])) {
      return false;
    }
  }
  return true;
}

這種優(yōu)化避免了深度比較的性能損耗

到此這篇關于React中useCallback 的基本使用和原理小結的文章就介紹到這了,更多相關React useCallback使用內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Hello?React的組件化方式之React入門小案例演示

    Hello?React的組件化方式之React入門小案例演示

    這篇文章主要介紹了Hello?React的組件化方式-React入門小案例,本文通過Hello?React的案例,?來體驗一下React開發(fā)模式,?以及jsx的語法,需要的朋友可以參考下
    2022-10-10
  • React-Native左右聯(lián)動List的示例代碼

    React-Native左右聯(lián)動List的示例代碼

    本篇文章主要介紹了React-Native左右聯(lián)動List的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • 詳解react-webpack2-熱模塊替換[HMR]

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

    這篇文章主要介紹了詳解react-webpack2-熱模塊替換[HMR], 小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • React實現(xiàn)多標簽在有限空間內展示

    React實現(xiàn)多標簽在有限空間內展示

    在業(yè)務中,需要在一個卡片組件中展示多個標簽,標簽組件高度相同,寬度和出現(xiàn)順序不同,要求標簽只能在有限的空間內展示,所以本文給大家介紹了React實現(xiàn)多標簽在有限空間內展示,需要的朋友可以參考下
    2023-12-12
  • Ant Design中使用css切換的問題及解決

    Ant Design中使用css切換的問題及解決

    這篇文章主要介紹了Ant Design中使用css切換的問題及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • React觸發(fā)render的實現(xiàn)方法

    React觸發(fā)render的實現(xiàn)方法

    這篇文章主要介紹了React觸發(fā)render的實現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • React的setState批量更新機制詳解

    React的setState批量更新機制詳解

    React 的 setState 批量更新是 React 優(yōu)化性能的重要機制,它通過減少不必要的渲染次數來提高應用性能,下面我將詳細解釋這一過程,需要的朋友可以參考下
    2025-05-05
  • React18中請求數據的官方姿勢適用其他框架

    React18中請求數據的官方姿勢適用其他框架

    這篇文章主要為大家介紹了官方回答在React18中請求數據的正確姿勢詳解,同樣也適用其他框架,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • React+Ant Design開發(fā)環(huán)境搭建的實現(xiàn)步驟

    React+Ant Design開發(fā)環(huán)境搭建的實現(xiàn)步驟

    這篇文章主要介紹了React+Ant Design開發(fā)環(huán)境搭建的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04
  • React中ES5與ES6寫法的區(qū)別總結

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

    這篇文章主要總結介紹了關于React中ES5與ES6的寫法區(qū)別,文中介紹的非常詳細,相信對大家具有一定的參考價值,需要的朋友們下面來一起看看吧。
    2017-04-04

最新評論