11|事件处理:如何创建自定义事件?
王沛
你好,我是王沛。今天我们来聊聊 React 中的事件处理。
我们知道,在 React 中,父子组件的交互是通过 props。这个机制其实是双向的,父组件通过 props 把值传递给子组件,而子组件则通过暴露一些事件,给父组件反馈到一些状态或数据。这两个环节是组件之间通信的基础,所以都需要熟练掌握。
我们前面的课程已经有很多通过 props 从父组件传递参数的子组件的场景了,那么今天这节课,我们就来看看在 React 中事件的机制是怎样的,从原理出发,帮助你深入理解。同时呢,也来学习一下对于自定义事件,一般都有哪些典型的应用场景,帮助你学以致用。
在 React 中使用原生事件
在 React 中进行事件监听的语法,和原生 DOM 事件的写法是非常类似的,都是在一个节点上加一个回调函数的属性来实现。比如下面的方式:
在前面的课程中我们已经看到了很多类似的例子。不过还要特别说明一点,对于原生 DOM 的事件,标准的的写法可能是都小写,比如 onclick。但是在 React 中,都是约定使用骆驼体(Camel Case)。
通过这个规律,我们基本上不用刻意去记事件的名称。我们要始终记得,只要原生 DOM 有的事件,在 React 中基本都可以使用,只是写法上采用骆驼体就可以了,比如 onMouseOver、onChange 等。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
React事件处理机制是本文的主要内容,包括原生DOM事件和React原生事件的原理,以及如何创建自定义事件和使用Hooks封装键盘事件。在React中,事件处理通过props进行父子组件之间的交互,而自定义事件则是通过传递回调函数给组件来实现。此外,文章还介绍了React中的合成事件机制和如何利用Hooks简化事件处理。通过本文,读者可以了解React中事件处理的基本原理和实际应用,以及如何利用Hooks来简化事件处理的过程。文章还提出了一个思考题,让读者深度思考如何用Hooks实现同时监听两个按键的功能。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《React Hooks 核心原理与实战》,新⼈⾸单¥59
《React Hooks 核心原理与实战》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(15)
- 最新
- 精选
- lugusliu”那么我们就需要在 useEffect 里去做 window.addEventListner,然后在返回的回调函数里去 window.removeEventListner,实现起来就很麻烦“ 这里有两处笔误 addEventListner -> addEventListener removeEventListner -> removeEventListener
作者回复: 感谢指出!
2021-08-163 - 喵咪爱吃肉追番~
作者回复: 一半啦~
2021-06-19 - 前端小猪因为点击了两个按钮会触发两个事件,所以我的想法是:使用数组的方式存储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 }2021-06-20112
- Geek_9ab0c7基本思路: 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(',') }2021-07-14110
- 知故我们可以分别建立2个按下的hooks,以及2个弹起的hooks, 作为数据源,用一个useMemo来监控这2个键同时按下的状态2021-08-291
- 罗大明老师,这样拿到的keyCode其实是上一次的吧(也就是上一个按下的键盘)这样监听没什么意义啊2021-08-051
- 闲闲老师我有两个问题,麻烦帮忙解答下: 1、上面绑定的键盘事件,hook里面具体什么时候回注销这个事件呢,代码是在useEffect return里面注销事件的,那具体什么时候会走到这代码里面呢? 2、看到这节课内容我想起来之前封装组件遇到的一个问题,场景是这样,需要封装一个公共组件,对于原生dom事件需要都能接受,其他的无用的props不想接受,react有什么方法可以判断当前的事件是不是原生dom支持的吗?还是说我需要具体的一一罗列?2021-06-2911
- 23568const 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; };2022-11-28归属地:上海
- INFRA_UEXReact 应该也可以在捕获阶段监听事件。例如 `onClickCapture`。2022-11-07归属地:天津
- Geek_d15b65const 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 }; }2022-06-20
收起评论