• lugusliu
    2021-08-16
    ”那么我们就需要在 useEffect 里去做 window.addEventListner,然后在返回的回调函数里去 window.removeEventListner,实现起来就很麻烦“ 这里有两处笔误 addEventListner -> addEventListener removeEventListner -> removeEventListener

    作者回复: 感谢指出!

    共 3 条评论
    
  • 喵咪爱吃肉
    2021-06-19
    追番~

    作者回复: 一半啦~

    
    
  • 前端小猪
    2021-06-20
    因为点击了两个按钮会触发两个事件,所以我的想法是:使用数组的方式存储key值,keyup的时候清空数组就行了: const useKeyPress = (domNode = document.body) => { const [keys, setKeys] = useState([]) useEffect(() => { const handleKeyPress = evt => { setKeys(prevKeys => { if (prevKeys.length !== 2) { return [...prevKeys, evt.keyCode] } else { return prevKeys } }) } domNode.addEventListener('keypress', handleKeyPress) return () => { domNode.removeEventListener('keypress', handleKeyPress) } }, [domNode]) return keys }
    共 1 条评论
    12
  • Geek_9ab0c7
    2021-07-14
    基本思路: 1. 使用数组存值;2. keydown存值; 3. 当keyup表示单键或者组合键按键结束,清空数组;4.当长按键不放会多次触发事件,所以setKey时需要去重 export default function useKeyPress (dom = document.body) { const [key, setKey] = useState([]) const isNext = useRef(true) // 当keyup之后,isNext置为true表示又是新一轮的按键监听 useEffect(() => { const handleKeyPress = (e) => { if (e.type === 'keydown') { if (isNext.current) setKey([]) setKey(keys => [...new Set([...keys, e.key])]) // 去重 isNext.current = false } else { isNext.current = true } } dom.addEventListener('keydown', handleKeyPress) dom.addEventListener('keyup', handleKeyPress) return () => { dom.removeEventListener('keydown', handleKeyPress) dom.removeEventListener('keydown', handleKeyPress) } }, [dom]) return key.join(',') }
    展开
    共 1 条评论
    9
  • 知故
    2021-08-29
    我们可以分别建立2个按下的hooks,以及2个弹起的hooks, 作为数据源,用一个useMemo来监控这2个键同时按下的状态
    
    1
  • 罗大明
    2021-08-05
    老师,这样拿到的keyCode其实是上一次的吧(也就是上一个按下的键盘)这样监听没什么意义啊
    
    1
  • 闲闲
    2021-06-29
    老师我有两个问题,麻烦帮忙解答下: 1、上面绑定的键盘事件,hook里面具体什么时候回注销这个事件呢,代码是在useEffect return里面注销事件的,那具体什么时候会走到这代码里面呢? 2、看到这节课内容我想起来之前封装组件遇到的一个问题,场景是这样,需要封装一个公共组件,对于原生dom事件需要都能接受,其他的无用的props不想接受,react有什么方法可以判断当前的事件是不是原生dom支持的吗?还是说我需要具体的一一罗列?
    共 1 条评论
    1
  • 23568
    2022-11-28 来自上海
    const useKeyPress = (domNode = document.body) => { const [key, setKey] = useState([]); useEffect(() => { const handleKeyPress = (evt) => { if (key.length === 2) { const tmpKey = [...key]; tmpKey.shift(); tmpKey.push(evt.key); setKey(tmpKey); } else { setKey((prev) => { return [...prev, evt.key]; }); } }; domNode.addEventListener("keypress", handleKeyPress); return () => { domNode.removeEventListener("keypress", handleKeyPress); }; }, [domNode, key]); return key; };
    
    
  • INFRA_UEX
    2022-11-07 来自天津
    React 应该也可以在捕获阶段监听事件。例如 `onClickCapture`。
    
    
  • Geek_d15b65
    2022-06-20
    const useKeyPress = (domNode = document.body ) => { const [key1, setKey1] = useState(null); const [key2, setKey2] = useState(null); const [flag, setFlag] = useState(0); useEffect(() => { const handleKeyPress = (evt) => { // 设置两种状态, 0 是key1,1是key2 if(flag === 0){ setKey1(evt.keyCode); setKey2(null); setFlag(1); }else if (flag === 1){ setKey2(evt.keyCode); setFlag(0); } }; // 监听按键事件 domNode.addEventListener('keypress', handleKeyPress); return () => { domNode.removeEventListener('keypress', handleKeyPress); } },[domNode, flag]); return { key1, key2 }; }
    展开
    
    