亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

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

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

雖然你在控制臺通過useEffect確認了uploadLoading的狀態(tài)確實發(fā)生了變化:

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

但是按鈕上的loading效果卻始終沒有更新。

二、常見排查思路與原因分析

1. 組件未重新渲染?

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

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

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

有時候我們在閉包中使用狀態(tài)變量(比如在useCallback、useMemo中),如果沒有正確設(shè)置依賴項,可能會導致閉包中獲取到的是舊值。

例如:

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

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

3. Ant Design 的 Button/Upload 組件受控性問題?

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

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

4. 父組件 props 沒有變化?

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

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

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

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

但如果你已經(jīng)通過 useEffect 打印確認了狀態(tài)變化,說明狀態(tài)本身沒有問題,只是 UI 沒有反映出來。

三、深入問題核心:useMemo依賴項不全

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

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

這意味著:

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

四、解決方案

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

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

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

五、知識擴展:React 中的閉包陷阱與依賴管理

1. 閉包陷阱(Closure in Callbacks)

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

例如:

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

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

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

2. useMemo 的依賴管理

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

建議:

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

3. Ant Design 組件的受控性

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

六、總結(jié)

問題本質(zhì):

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

解決方法:

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

延伸學習:

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

七、參考代碼修改示例

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)失效問題的解決方案的詳細內(nèi)容,更多關(guān)于React按鈕loading狀態(tài)失效的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • react18中react-redux狀態(tài)管理的實現(xiàn)

    react18中react-redux狀態(tài)管理的實現(xiàn)

    本文主要介紹了react18中react-redux狀態(tài)管理的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-05-05
  • React Native實現(xiàn)地址挑選器功能

    React Native實現(xiàn)地址挑選器功能

    這篇文章主要為大家詳細介紹了React Native仿地址挑選器功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • React?Hook實現(xiàn)對話框組件

    React?Hook實現(xiàn)對話框組件

    這篇文章主要為大家詳細介紹了React?Hook實現(xiàn)對話框組件,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • React中useRef的具體使用

    React中useRef的具體使用

    這篇文章主要介紹了React中useRef的具體使用,它可以用來獲取組件實例對象或者是DOM對象,除此之外還有哪些用法,就一起來了解一下
    2021-04-04
  • React Native AsyncStorage本地存儲工具類

    React Native AsyncStorage本地存儲工具類

    這篇文章主要為大家分享了React Native AsyncStorage本地存儲工具類,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • React實現(xiàn)倒計時功能組件

    React實現(xiàn)倒計時功能組件

    這篇文章主要為大家詳細介紹了如何通過React實現(xiàn)一個倒計時功能組件,文中的示例代碼講解詳細,具有一定的學習價值,感興趣的小伙伴可以了解下
    2023-09-09
  • React Hooks的深入理解與使用

    React Hooks的深入理解與使用

    這篇文章主要介紹了React Hooks的深入理解與使用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-11-11
  • React中的Component組件詳解

    React中的Component組件詳解

    本章節(jié),我們將一起探討 React 中類組件和函數(shù)組件的定義,不同組件的通信方式,以及常規(guī)組件的強化方式,幫助你全方位認識 React 組件,從而對 React 的底層邏輯有進一步的理解,感興趣的朋友跟隨小編一起看看吧
    2023-06-06
  • react-router-dom入門使用教程(前端路由原理)

    react-router-dom入門使用教程(前端路由原理)

    這篇文章主要介紹了react-router-dom入門使用教程,主要包括react路由相關(guān)理解,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-08-08
  • 淺談React雙向數(shù)據(jù)綁定原理

    淺談React雙向數(shù)據(jù)綁定原理

    在 React中是不存在雙向數(shù)據(jù)綁定的機制的,需要我們自己對其進行實現(xiàn)。本文主要介紹一下React雙向數(shù)據(jù)綁定,感興趣的可以了解一下
    2021-11-11

最新評論