React的合成事件

React的事件处理使用合成事件(SyntheticEvent),不是原生事件。

1. 合成事件的异步访问

合适事件为了节约性能,使用对象池。当一个合成事件对象被使用完毕,即调用该对象的同步代码执行完毕,该对象会被再次利用。
其属性会被重置为null。所以异步访问合适事件的属性,是无效的。

解决方法有两种:

1.1 用变量记录事件属性值

用变量记录合成事件的属性值,在异步程序中访问,就没有任何问题了。

复制代码
function onClick(event) {
  console.log(event); // => nullified object.
  console.log(event.type); // => "click"
  const eventType = event.type; // => "click"

  setTimeout(function() {
    console.log(event.type); // => null
    console.log(eventType); // => "click"
  }, 0);
}
复制代码

1.2 用e.persist()方法

e.persist()方法,会将当前的合成事件对象,从对象池中移除,就不会回收该对象了。对象可以被异步程序访问到。

2. 合成事件阻止冒泡

2.1 e.stopPropagation

只能阻止合成事件间冒泡,即下层的合成事件,不会冒泡到上层的合成事件。事件本身还都是在document上执行。最多只能阻止document事件不能再冒泡到window上。

2.2 e.nativeEvent.stopImmediatePropagation

能阻止合成事件不会冒泡到document上。

可以实现点击空白处关闭菜单的功能:

在菜单打开的一刻,在document上动态注册事件,用来关闭菜单。
点击菜单内部,由于不冒泡,会正常执行菜单点击。
点击菜单外部,执行document上事件,关闭菜单。
在菜单关闭的一刻,在document上移除该事件,这样就不会重复执行该事件,浪费性能。

也可以在window上注册事件,这样可以避开document。

posted @   全玉  阅读(2777)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示