問題
在我的個人網站中,需要綁定 / 鍵作為打開和關閉文章目錄的快捷鍵,
最簡單的方法是在 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 獲取的是原來的值。
