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

React組件中按鈕的loading狀態(tài)失效問(wèn)題的解決方案

 更新時(shí)間:2025年07月01日 09:01:07   作者:Danny_FD  
在React開(kāi)發(fā)過(guò)程中,我遇到這樣的情況:頁(yè)面按鈕的loading屬性失效,盡管通過(guò)useEffect打印發(fā)現(xiàn)loading狀態(tài)(確實(shí)在true和false之間切換,但按鈕卻沒(méi)有表現(xiàn)出預(yù)期的加載效果,所以本文給大家介紹了失效的解決方案,需要的朋友可以參考下

一、問(wèn)題現(xiàn)象回顧

const [uploadLoading, setUploadLoading] = useState(false);

<Button loading={uploadLoading}>上傳文件</Button>

雖然你在控制臺(tái)通過(guò)useEffect確認(rèn)了uploadLoading的狀態(tài)確實(shí)發(fā)生了變化:

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

但是按鈕上的loading效果卻始終沒(méi)有更新。

二、常見(jiàn)排查思路與原因分析

1. 組件未重新渲染?

使用useStateuseEffect時(shí),只要狀態(tài)發(fā)生變化,React會(huì)自動(dòng)觸發(fā)組件的重新渲染。因此理論上來(lái)說(shuō),組件應(yīng)該更新。如果你能看到useEffect中的打印,說(shuō)明狀態(tài)確實(shí)變了,也說(shuō)明組件至少執(zhí)行了一次渲染。

結(jié)論:不是組件不更新的問(wèn)題。

2. 狀態(tài)變量作用域或引用問(wèn)題?

有時(shí)候我們?cè)陂]包中使用狀態(tài)變量(比如在useCallback、useMemo中),如果沒(méi)有正確設(shè)置依賴項(xiàng),可能會(huì)導(dǎo)致閉包中獲取到的是舊值。

例如:

const handleClick = useCallback(() => {
  console.log(uploadLoading); // 可能是舊值
}, []);

不過(guò)在這個(gè)問(wèn)題中,我們關(guān)注的是直接傳給按鈕的loading屬性,所以這個(gè)可能性較低。

3. Ant Design 的 Button/Upload 組件受控性問(wèn)題?

Ant Design 的 ButtonUpload 組件對(duì) loading 屬性通常是“受控”的,也就是說(shuō)它們的行為完全取決于你傳入的 loading 值。只要你傳入的值正確,它就應(yīng)該正常工作。

結(jié)論:組件本身沒(méi)有問(wèn)題,關(guān)鍵在于傳入的值是否是最新的。

4. 父組件 props 沒(méi)有變化?

如果你使用的某個(gè)自定義 Hook(如 useMemeberTable)返回了 loading 狀態(tài),而其內(nèi)部邏輯依賴于某些 props,那么如果這些 props 沒(méi)有變化,Hook 返回的狀態(tài)也可能不變。

這種情況需要檢查 Hook 的實(shí)現(xiàn)邏輯以及調(diào)用它的組件是否更新了 props。

5. React 18 的嚴(yán)格模式或并發(fā)特性?

React 18 引入了并發(fā)模式的一些新特性,比如過(guò)渡更新(transitions)、批處理等,有時(shí)會(huì)讓狀態(tài)更新看起來(lái)“延遲”了。

但如果你已經(jīng)通過(guò) useEffect 打印確認(rèn)了狀態(tài)變化,說(shuō)明狀態(tài)本身沒(méi)有問(wèn)題,只是 UI 沒(méi)有反映出來(lái)。

三、深入問(wèn)題核心:useMemo依賴項(xiàng)不全

const columns = useMemo(() => {
  return [
    {
      title: '操作',
      dataIndex: 'action',
      render: (_, record) => (
        <Button loading={uploadLoading}>上傳文件</Button>
      )
    }
  ];
}, [tab]); // 僅依賴 tab

這里的關(guān)鍵問(wèn)題是:columns 是通過(guò) useMemo 緩存生成的,而它的依賴數(shù)組只有 [tab],并沒(méi)有包含 uploadLoadingfileLoading。

這意味著:

  • 當(dāng) uploadLoading 發(fā)生變化時(shí),columns 不會(huì)重新計(jì)算。
  • 因此,render 函數(shù)中使用的仍然是最初創(chuàng)建時(shí)的 uploadLoading 值(即閉包中的舊值)。
  • 這就導(dǎo)致按鈕的 loading 屬性始終為初始值,無(wú)法更新。

四、解決方案

要解決這個(gè)問(wèn)題,只需要將 uploadLoadingfileLoading 添加到 useMemo 的依賴數(shù)組中:

const columns = useMemo(() => {
  return [
    {
      title: '操作',
      dataIndex: 'action',
      render: (_, record) => (
        <Button loading={uploadLoading}>上傳文件</Button>
      )
    }
  ];
}, [tab, uploadLoading, fileLoading]); // 添加 missing dependencies

這樣,每當(dāng) uploadLoadingfileLoading 改變時(shí),columns 會(huì)被重新生成,render 函數(shù)也會(huì)拿到最新的狀態(tài)值,從而正確更新按鈕的 loading 狀態(tài)。

五、知識(shí)擴(kuò)展:React 中的閉包陷阱與依賴管理

1. 閉包陷阱(Closure in Callbacks)

在 React 中,函數(shù)組件本質(zhì)上是一個(gè)閉包函數(shù)。當(dāng)你在 useCallbackuseEffectuseMemo 中引用狀態(tài)變量時(shí),如果不更新依賴項(xiàng),就會(huì)導(dǎo)致函數(shù)體中使用的是舊的狀態(tài)值。

例如:

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

const logCount = useCallback(() => {
  console.log(count);
}, []);

// 即使 count 更新,logCount 仍會(huì)輸出初始值 0

2. useMemo 的依賴管理

useMemo 用于緩存計(jì)算結(jié)果以提高性能,但它依賴的變量必須完整列出,否則會(huì)導(dǎo)致緩存值過(guò)期。

建議:

  • 使用 ESLint 插件(如 eslint-plugin-react-hooks)來(lái)檢測(cè)依賴項(xiàng)是否完整。
  • 對(duì)于復(fù)雜對(duì)象或數(shù)組,考慮使用 useDeepCompareMemo 來(lái)做深度比較。

3. Ant Design 組件的受控性

Ant Design 的大多數(shù)組件都支持受控模式,即其狀態(tài)完全由你傳入的 props 控制。因此,確保傳入的 props 是最新且正確的,是使用這些組件的關(guān)鍵。

六、總結(jié)

問(wèn)題本質(zhì):

useMemo 的依賴項(xiàng)未包含所有影響其內(nèi)部邏輯的狀態(tài)變量(如 uploadLoading 和 fileLoading),導(dǎo)致閉包中獲取的是舊值,按鈕的 loading 狀態(tài)未更新。

解決方法:

將 uploadLoading 和 fileLoading 添加到 useMemo 的依賴數(shù)組中。

延伸學(xué)習(xí):

  • React 的閉包機(jī)制與依賴管理
  • 如何正確使用 useMemo、useCallback
  • Ant Design 組件的受控與非受控模式
  • React 18 新特性與狀態(tài)更新機(jī)制

七、參考代碼修改示例

const columns = useMemo(() => {
  return [
    {
      title: '操作',
      dataIndex: 'action',
      render: (_, record) => (
        <>
          <Button loading={uploadLoading} onClick={() => setId(record.id)}>
            上傳文件
          </Button>
          <Button loading={fileLoading} onClick={() => fetchFile(record.id)}>
            下載文件
          </Button>
        </>
      )
    }
  ];
}, [tab, uploadLoading, fileLoading]);

以上就是React組件中按鈕的loading狀態(tài)失效問(wèn)題的解決方案的詳細(xì)內(nèi)容,更多關(guān)于React按鈕loading狀態(tài)失效的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • React前端DOM常見(jiàn)Hook封裝示例上

    React前端DOM常見(jiàn)Hook封裝示例上

    這篇文章主要為大家介紹了React前端DOM常見(jiàn)Hook封裝示例上篇,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • React中事件綁定的5種實(shí)現(xiàn)方式和優(yōu)劣對(duì)比全攻略

    React中事件綁定的5種實(shí)現(xiàn)方式和優(yōu)劣對(duì)比全攻略

    在React中,事件綁定不僅僅是把函數(shù)和元素連接起來(lái)那么簡(jiǎn)單,它關(guān)系到很多方面,下面我們就來(lái)一起來(lái)看看React事件綁定的5種主要方式,以及它們各自的優(yōu)缺點(diǎn)吧
    2026-01-01
  • ReactJs實(shí)現(xiàn)樹(shù)形結(jié)構(gòu)的數(shù)據(jù)顯示的組件的示例

    ReactJs實(shí)現(xiàn)樹(shù)形結(jié)構(gòu)的數(shù)據(jù)顯示的組件的示例

    本篇文章主要介紹了ReactJs實(shí)現(xiàn)樹(shù)形結(jié)構(gòu)的數(shù)據(jù)顯示的組件的示例,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2017-08-08
  • React中使用Vditor自定義圖片詳解

    React中使用Vditor自定義圖片詳解

    這篇文章主要介紹了React中使用Vditor自定義圖片詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • JavaScript React如何修改默認(rèn)端口號(hào)方法詳解

    JavaScript React如何修改默認(rèn)端口號(hào)方法詳解

    這篇文章主要介紹了JavaScript React如何修改默認(rèn)端口號(hào)方法詳解,文中通過(guò)步驟圖片解析介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • 詳解react-refetch的使用小例子

    詳解react-refetch的使用小例子

    這篇文章主要介紹了詳解react-refetch的使用小例子,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-02-02
  • React和Vue實(shí)現(xiàn)文件下載進(jìn)度條

    React和Vue實(shí)現(xiàn)文件下載進(jìn)度條

    本文主要介紹了React和Vue實(shí)現(xiàn)文件下載進(jìn)度條,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • react-native只保留3x圖原理解析

    react-native只保留3x圖原理解析

    這篇文章主要為大家介紹了react-native只保留3x圖原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • 深入理解React中Suspense與lazy的原理

    深入理解React中Suspense與lazy的原理

    在react中為我們提供了一個(gè)非常有用的組件,那就是Suspense,本文主要介紹了如何使用Suspense?和?react提供的lazy結(jié)合起來(lái)達(dá)到異步加載狀態(tài)的目的,感興趣的可以了解下
    2024-04-04
  • React類組件中super()和super(props)的區(qū)別詳解

    React類組件中super()和super(props)的區(qū)別詳解

    這篇文章給大家詳細(xì)介紹了React類組件中super()和super(props)有什么區(qū)別,文中通過(guò)代碼示例給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-01-01

最新評(píng)論

丹东市| 尼勒克县| 泰州市| 南皮县| 绥滨县| 遂川县| 曲麻莱县| 天峨县| 罗平县| 伊金霍洛旗| 乐东| 渭南市| 大荔县| 定结县| 岳阳县| 赞皇县| 和硕县| 兴安县| 金寨县| 突泉县| 玉林市| 昌图县| 清原| 曲松县| 宜春市| 乌恰县| 柘荣县| 调兵山市| 凤山县| 晋中市| 济南市| 永和县| 新乡县| 泸定县| 维西| 庆安县| 玛沁县| 凤阳县| 彝良县| 台东市| 锡林郭勒盟|