[英]How useState works with eventListener in react
在下面的沙盒項目中,我嘗試使用自定義掛鈎來附加事件偵聽器。
在 useEventListener.js 文件中,如果我將 savedHandler.current 函數直接傳遞給事件偵聽器(第 21 行),我在狀態更新期間不會獲得更新的狀態值。 只有當我在匿名函數中使用 savedHandler.current 函數時(第 19 行),我才能獲得更新的狀態值。
有人可以幫我理解這是如何工作的嗎? 這是因為這個參考嗎?
https://codesandbox.io/s/gracious-cloud-kjw7dk?file=/src/useEventListener.js
謝謝
這是我能解釋的最好的:
對於上下文,當您單擊切換標志按鈕時,只有您的第一個useEffect(callback,[handler])
在每次渲染后運行,而您的第二個useEffect(callback,[eventName,element])
在初始渲染后僅運行一次。
useCallback
返回的函數,因此在每個事件上,由於以下原因,都會調用相同的函數:事件僅注冊一次,並且清理函數不會運行,因為useEffect
僅在初始渲染后運行一次(清理函數將在實例中運行,就在依賴項更改導致下一個副作用之前以及組件卸載時)。 因此,您只需使用一個在渲染中持續存在的記憶化回調來注冊事件一次。 在第一個useEffect
中對savedHandler.current的更新不會更新在第二個useEffect
中傳遞給事件偵聽器的回調,因為它不會重新運行,因此不會更新傳遞給事件偵聽器的回調。 就是這個。 要自己確認,請嘗試添加處理程序作為第二個useEffect
的依賴項,並將savedHandler.current直接傳遞給事件偵聽器。 您將獲得更新的狀態值,因為useEffect
現在在每次更新處理程序后運行,並且事件偵聽器獲取要調用的最新回調。 而不是創建另一個變量,您可以直接執行element.addEventListener(eventName, (event) => savedHandler.current(event));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.