React Hooks 核心原理与实战
王沛
eBay 中国研发中心资深技术专家
10740 人已学习
新⼈⾸单¥59
登录后,你可以任选2讲全文学习
课程目录
已完结/共 25 讲
React Hooks 核心原理与实战
15
15
1.0x
00:00/00:00
登录|注册

11|事件处理:如何创建自定义事件?

你好,我是王沛。今天我们来聊聊 React 中的事件处理。
我们知道,在 React 中,父子组件的交互是通过 props。这个机制其实是双向的,父组件通过 props 把值传递给子组件,而子组件则通过暴露一些事件,给父组件反馈到一些状态或数据。这两个环节是组件之间通信的基础,所以都需要熟练掌握。
我们前面的课程已经有很多通过 props 从父组件传递参数的子组件的场景了,那么今天这节课,我们就来看看在 React 中事件的机制是怎样的,从原理出发,帮助你深入理解。同时呢,也来学习一下对于自定义事件,一般都有哪些典型的应用场景,帮助你学以致用。

在 React 中使用原生事件

在 React 中进行事件监听的语法,和原生 DOM 事件的写法是非常类似的,都是在一个节点上加一个回调函数的属性来实现。比如下面的方式:
<button onClick={handler}>Hello</button>
在前面的课程中我们已经看到了很多类似的例子。不过还要特别说明一点,对于原生 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
立即购买
登录 后留言

全部留言(15)

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

    作者回复: 感谢指出!

    2021-08-16
    3
  • 喵咪爱吃肉
    追番~

    作者回复: 一半啦~

    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-20
    1
    12
  • 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-14
    1
    10
  • 知故
    我们可以分别建立2个按下的hooks,以及2个弹起的hooks, 作为数据源,用一个useMemo来监控这2个键同时按下的状态
    2021-08-29
    1
  • 罗大明
    老师,这样拿到的keyCode其实是上一次的吧(也就是上一个按下的键盘)这样监听没什么意义啊
    2021-08-05
    1
  • 闲闲
    老师我有两个问题,麻烦帮忙解答下: 1、上面绑定的键盘事件,hook里面具体什么时候回注销这个事件呢,代码是在useEffect return里面注销事件的,那具体什么时候会走到这代码里面呢? 2、看到这节课内容我想起来之前封装组件遇到的一个问题,场景是这样,需要封装一个公共组件,对于原生dom事件需要都能接受,其他的无用的props不想接受,react有什么方法可以判断当前的事件是不是原生dom支持的吗?还是说我需要具体的一一罗列?
    2021-06-29
    1
    1
  • 23568
    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; };
    2022-11-28归属地:上海
  • INFRA_UEX
    React 应该也可以在捕获阶段监听事件。例如 `onClickCapture`。
    2022-11-07归属地:天津
  • Geek_d15b65
    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 }; }
    2022-06-20
收起评论
显示
设置
留言
15
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部