解決 React 在 KeyPress 事件中 useState() 的 set 方法不生效的問題


問題

在我的個人網站中,需要綁定 / 鍵作為打開和關閉文章目錄的快捷鍵,

最簡單的方法是在 useEffect 中添加 window.addEventListener("keypress", listener)

然后判斷一下 e.key === "/",再用 React 中的 useState 控制一個變量來開啟和關閉目錄。

  const [open, setOpen] = useState(false)

  useEffect(() => {
    const listener = (e: KeyboardEvent) => {
      if (e.key === "/") {
        e.preventDefault()
        setOpen(!open)
      }
    }

    window.addEventListener("keypress", listener)
    return () => window.removeEventListener("keypress", listener)
  }, [])

原來的代碼是這樣的,但是實際測試遇到了 setOpen(!open) 這句不生效的問題。

解決

setOpen(!open) 改為 setOpen(open => !open) 這樣就可以了。

原因可能是閉包,導致了 open 獲取的是原來的值。

參考資料


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM