首頁 > web前端 > js教程 > 主體

使用 React Hooks 和事件監聽器時,為什麼狀態控制台日誌顯示錯誤訊息?

Barbara Streisand
發布: 2024-10-18 20:13:30
原創
716 人瀏覽過

When Using React Hooks and Event Listeners, Why Does the State Console Log Display Incorrect Information?

事件監聽器和React Hooks

問題:使用React hooks 和事件監聽器時,狀態控制台日誌顯示不正確的資訊。

問題描述

考慮提供的CodeSandbox:https://codesandbox.io/s/lrxw1wr97m。當您按一下「新增卡片」按鈕兩次,然後按一下第一張卡片中的「Button1」時,控制台會正確顯示有兩張卡片的狀態。但是,如果您按一下同一張卡片中的「Button2」(由事件偵聽器處理),控制台會錯誤地僅顯示一張卡片的狀態。

狀態不正確的原因

問題源自於 CardsProvider 和 Card 元件中事件處理程序的不同處理。每次呈現該元件時,都會重新定義 CardsProvider 功能元件中定義的事件處理程序(handleCardClick 和 handleButtonClick)。這意味著它們引用的是定義時的狀態,當觸發事件偵聽器時,該狀態可能會過時。

另一方面,Card 元件使用 useRef 來註冊事件偵聽器,該事件偵聽器會持續存在貫穿元件的整個生命週期。因此,事件偵聽器函數引用元件安裝時的狀態,該狀態已過時。

解決方案- 使用狀態更新器函數

一種解決方案是使用狀態更新器接收新鮮狀態作為參數的函數,而不是依賴於封閉範圍中的陳舊狀態:

<code class="javascript">const eventListener = () => {
  // Function receives fresh state
  setState(freshState => freshState + 1);
};

// Event listener is registered using `useEffect` to ensure it is only registered once
useEffect(() => {
  // Register event listener
  // ...

  // Unregister event listener on component unmount
  return () => {
    // ...
  };
}, []);</code>
登入後複製

在這種情況下,事件偵聽器接收新鮮狀態,從而消除了陳舊資料的問題。但是,需要注意的是,狀態更新器函數可以傳回相同的狀態,以防止不必要的更新。在狀態更新函數中使用 console.log 來觀察狀態變化。

其他解決方案

解決此問題的替代方法包括:

  • Mutable狀態:使用useRef而不是Stateuse。
  • 手動事件監聽器重新註冊:每次狀態改變時重新註冊事件監聽器。
  • 內建事件處理:使用React的內建事件處理而不是自訂事件監聽器。

以上是使用 React Hooks 和事件監聽器時,為什麼狀態控制台日誌顯示錯誤訊息?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板