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

react解決 Hooks 閉包陷阱的問(wèn)題

 更新時(shí)間:2026年05月29日 09:13:10   作者:光影少年  
本文主要介紹了react解決 Hooks 閉包陷阱的問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

React Hooks 的“閉包陷阱(stale closure)”本質(zhì)是:函數(shù)拿到的是創(chuàng)建時(shí)那一刻的 state/props,而不是最新值。常見(jiàn)出現(xiàn)在 setTimeout、setInterval、事件監(jiān)聽(tīng)、異步請(qǐng)求、useEffect 中。

例如:

import { useState } from 'react';
export default function Demo() {
  const [count, setCount] = useState(0);
  const handleClick = () => {
    setTimeout(() => {
      console.log(count); // 永遠(yuǎn)打印點(diǎn)擊時(shí)的 count
    }, 3000);
  };
  return (
    <>
      <button onClick={() => setCount(count + 1)}>
        +1
      </button>
      <button onClick={handleClick}>
        延遲打印
      </button>
    </>
  );
}

假設(shè):

count = 0
點(diǎn)擊延遲打印
馬上點(diǎn)擊 +1 -> count=1
3秒后輸出:0

因?yàn)?setTimeout 閉包保存的是舊 count

解決方案1:函數(shù)式更新(推薦處理 state 更新)

適合依賴(lài)舊值計(jì)算新值。

錯(cuò)誤:

setCount(count + 1);
setCount(count + 1);
console.log(count); // +1

正確:

setCount(prev => prev + 1);
setCount(prev => prev + 1);
console.log(count); // +2

React 會(huì)拿最新?tīng)顟B(tài):

setInterval(() => {
   setCount(prev => prev + 1);
},1000);

避免:

setCount(count + 1); // count 永遠(yuǎn)舊 

解決方案2:useRef 保存最新值(最常見(jiàn))

適合:

  • setTimeout
  • setInterval
  • websocket
  • 原生事件
  • 防抖節(jié)流

例子:

import { useRef, useState, useEffect } from 'react';
export default function Demo() {
  const [count, setCount] = useState(0);
  const countRef = useRef(count);
  useEffect(() => {
    countRef.current = count;
  }, [count]);
  const handleClick = () => {
    setTimeout(() => {
      console.log(countRef.current);
    }, 3000);
  };
  return (
      <>
          <button onClick={() => setCount(count+1)}>
             +1
          </button>
          <button onClick={handleClick}>
             打印
          </button>
      </>
  );
}

始終輸出最新值。

原理:

閉包 -> 拿不到最新 state
ref.current -> 永遠(yuǎn)最新

很多庫(kù)(例如防抖 hooks)都這么做。

解決方案3:正確維護(hù) useEffect 依賴(lài)

錯(cuò)誤:

useEffect(() => {
   getData(id);
}, []);

即使 id 變化也不會(huì)重新執(zhí)行。

應(yīng)寫(xiě):

useEffect(() => {
   getData(id);
}, [id]);

遵守 eslint:

react-hooks/exhaustive-deps 

不要隨便關(guān):

// eslint-disable-next-line 

很多閉包問(wèn)題來(lái)自錯(cuò)誤依賴(lài)。

解決方案4:useCallback + 依賴(lài)更新

錯(cuò)誤:

const getUser = useCallback(() => {
    console.log(id);
}, []);

id 永遠(yuǎn)舊。

正確:

const getUser = useCallback(() => {
    console.log(id);
}, [id]);

解決方案5:抽離自定義 Hook(推薦業(yè)務(wù)場(chǎng)景)

比如輪詢(xún):

錯(cuò)誤:

useEffect(() => {
   const timer=setInterval(()=>{
      fetchData(page);
   },1000)
   return ()=>clearInterval(timer)
},[])

page 永遠(yuǎn)舊。

改:

function useLatest(value){
   const ref=useRef(value);
   useEffect(()=>{
      ref.current=value;
   },[value])
   return ref;
}

使用:

const pageRef = useLatest(page);
useEffect(() => {
   const timer = setInterval(() => {
      fetchData(pageRef.current);
   },1000);
   return ()=>clearInterval(timer);
},[])

解決方案6:React 19 的useEffectEvent(未來(lái)推薦)

React 提供了解決閉包問(wèn)題的新方案:

const onVisit = useEffectEvent(() => {
   console.log(count);
});
useEffect(()=>{
   window.addEventListener('click',onVisit)
   return ()=>{
      window.removeEventListener('click',onVisit)
   }
},[])

事件始終讀取最新 state。

適合:

  • 訂閱
  • 監(jiān)聽(tīng)器
  • effect 內(nèi)回調(diào)

前端開(kāi)發(fā)里可以記一個(gè)經(jīng)驗(yàn):

需要最新?tīng)顟B(tài):
→ 用 ref
 
依賴(lài)舊狀態(tài)更新:
→ 用函數(shù)式 setState
 
effect/callback 使用變量:
→ 補(bǔ)全依賴(lài)數(shù)組
 
長(zhǎng)生命周期回調(diào):
→ useLatest / useRef
 
React19:
→ useEffectEvent

像你做性能平臺(tái)、輪詢(xún)二維碼狀態(tài)、下載任務(wù)進(jìn)度這些場(chǎng)景,setInterval + useRef 基本是閉包問(wèn)題高發(fā)區(qū)。

到此這篇關(guān)于react解決 Hooks 閉包陷阱的問(wèn)題的文章就介紹到這了,更多相關(guān)react Hooks 閉包陷阱內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • React如何避免子組件無(wú)效刷新

    React如何避免子組件無(wú)效刷新

    這篇文章主要介紹了React幾種避免子組件無(wú)效刷新的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • Reactjs?錯(cuò)誤邊界優(yōu)雅處理方法demo

    Reactjs?錯(cuò)誤邊界優(yōu)雅處理方法demo

    這篇文章主要為大家介紹了Reactjs?錯(cuò)誤邊界優(yōu)雅處理方法demo,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • react實(shí)現(xiàn)路由攔截的示例代碼

    react實(shí)現(xiàn)路由攔截的示例代碼

    這篇文章主要介紹react實(shí)現(xiàn)路由攔截的,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2024-02-02
  • react實(shí)現(xiàn)導(dǎo)航欄二級(jí)聯(lián)動(dòng)

    react實(shí)現(xiàn)導(dǎo)航欄二級(jí)聯(lián)動(dòng)

    這篇文章主要為大家詳細(xì)介紹了react實(shí)現(xiàn)導(dǎo)航欄二級(jí)聯(lián)動(dòng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • React?Native實(shí)際項(xiàng)目中的經(jīng)驗(yàn)和踩坑記錄

    React?Native實(shí)際項(xiàng)目中的經(jīng)驗(yàn)和踩坑記錄

    在當(dāng)今移動(dòng)應(yīng)用開(kāi)發(fā)的浪潮中,React Native以其跨平臺(tái)、高效開(kāi)發(fā)的特點(diǎn)脫穎而出,成為眾多開(kāi)發(fā)者首選的框架之一,這篇文章主要介紹了React Native實(shí)際項(xiàng)目中的經(jīng)驗(yàn)和踩坑記錄的相關(guān)資料,需要的朋友可以參考下
    2026-03-03
  • Javascript之提高React性能的技巧

    Javascript之提高React性能的技巧

    一些剛開(kāi)始學(xué)習(xí) React,或者從其他框架轉(zhuǎn)入 React 的開(kāi)發(fā)者,一開(kāi)始可能不會(huì)太關(guān)注性能。因?yàn)樾枰恍r(shí)間來(lái)發(fā)現(xiàn)新學(xué)習(xí)的框架的性能缺點(diǎn)。這篇文章主要介紹提高React性能的技巧,感興趣的同學(xué)可以參考閱讀
    2023-04-04
  • Unity?RectTransform詳解

    Unity?RectTransform詳解

    unity中的ui元素是有嚴(yán)格的父子關(guān)系的,子物體的位置是根據(jù)父物體的變化而變化的,而子物體和父物體聯(lián)系的橋梁就是Anchor,本文重點(diǎn)介紹Unity?RectTransform的相關(guān)知識(shí),感興趣的朋友一起看看吧
    2024-01-01
  • React 父子組件通信的實(shí)現(xiàn)方法

    React 父子組件通信的實(shí)現(xiàn)方法

    這篇文章主要介紹了React 父子組件通信的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • react配置px轉(zhuǎn)換rem的方法

    react配置px轉(zhuǎn)換rem的方法

    這篇文章主要介紹了react配置px轉(zhuǎn)換rem的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • 詳解React中的不可變值

    詳解React中的不可變值

    這篇文章主要介紹了React中的不可變值的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用react.js,感興趣的朋友可以了解下
    2021-04-04

最新評(píng)論

庆城县| 万盛区| 田林县| 梅河口市| 岐山县| 睢宁县| 钟祥市| 正阳县| 拜泉县| 泸溪县| 聊城市| 宝坻区| 蒲江县| 报价| 淳化县| 汉川市| 明星| 绵阳市| 科技| 同仁县| 民权县| 莎车县| 灌云县| 仁化县| 洛扎县| 多伦县| 南陵县| 开平市| 南岸区| 吴忠市| 泽库县| 松桃| 静乐县| 汾阳市| 方山县| 宣城市| 扎鲁特旗| 绥棱县| 通道| 秀山| 刚察县|