首页 > 其他分享 >React 事件独特的触发方式

React 事件独特的触发方式

时间:2022-12-19 23:34:11浏览次数:71  
标签:触发 元素 绑定 React 事件 click 独特

今天在逛知乎的时候发现顶部出现了广告横幅,并且并没有被我写的油猴脚本清除掉,于是便想把它添加到油猴脚本规则中去。

banner

最开始想着通过更改 CSS 样式的方法解决,却发现他顶部文字处理起来及其麻烦。于是我便改变思路,通过点击右上角的按钮让他自己关闭。本以为这个方法实施起来应该没啥难度,获取元素通过 click 方法点击即可。可当我把代码敲上后却发现并没有找到 click 方法,这让我很是疑惑,试了下别的通过绑定 click 触发事件的元素也同样无法使用 click 方法。

error

这让我更加疑惑,我寻思这不是显示绑定着方法吗?

listener

于是我便点击进去看看到底绑定的什么函数,可看到函数却傻了眼,它绑定的函数是空的。

function

???

这是啥情况?

在我不知所措,胡乱翻看时发现知乎采用了 React 框架。

react

莫非这是 React 导致的?一番疯狂查阅后大概明白了什么情况。但由于之前没学过 React ,所以只了解到了个皮毛,可能有不对的地方。

在 React 中,我们给元素绑定的事件并没有绑定到元素本身上,而是绑定在了 document 上进行统一管理,元素本身绑定的函数被替换成了空函数,这在 React 中被称为合成事件

与原生事件直接在元素上注册的方式不同的是,React 的合成事件不会直接绑定到目标 DOM 节点上,而是用事件委托机制,以队列的方式,从触发事件的组件向父组件回溯,直到 Root 节点。因此,React 组件上声明的事件最终绑定到了 Root 对象 (React17 之前是 document) 上。

因为知乎 React 版本号没有到 17 所以我们确实发现在 document 中绑定了许多的 click 事件。

document

这样在点击元素时会触发 document 绑定的统一事件,并在冒泡阶段来逐个触发每个元素所绑定的函数。而函数的触发在 React 中是由 dispatchEvent 函数进行处理,所以我们可以通过它来出触发元素绑定的事件。

document.querySelector('.Topstory>div:not([class]) svg').dispatchEvent(
    new MouseEvent('click', {
        bubbles: true,
    })
);

至此,问题解决。

参考资料

标签:触发,元素,绑定,React,事件,click,独特
From: https://www.cnblogs.com/huanfeiiiii/p/16993385.html

相关文章

  • ReactNative(三)——WebStorm的基本配置
    设置.js文件默认以jsx的语法打开在没有进行设置的情况下,每次打开WebStorm的时候打开包含jsx语法的.js文件都会有以下提示:当然我们点击转换后就可以了,但是每次都会提示,所以还......
  • react 打开新窗口
    话不多说,直接上代码:使用路由提供的history对象const{history}=this.propsconstdomA=document.createElement('a')domA.href=history.createHref({pathname:......
  • web前端经典react面试题
    redux有什么缺点一个组件所需要的数据,必须由父组件传过来,而不能像flux中直接从store取。当一个组件相关数据更新时,即使父组件不需要用到这个组件,父组件还是会重新render......
  • 老生常谈React的diff算法原理-面试版
    第一次发文章notonly(虽然)版式可能有点烂butalso(但是)最后赋有手稿研究finally看完他你有收获diff算法:对于update的组件,他会将当前组件与该组件在上次更新是对应的......
  • 社招前端二面react面试题整理
    解释React中render()的目的。每个React组件强制要求必须有一个render()。它返回一个React元素,是原生DOM组件的表示。如果需要渲染多个HTML元素,则必须将它们组......
  • NPM 支持更高的 ReactJS 版本
     couldnotresolvedependency:npmerr!peerreact@“^16.8.0||^17.0.0“from@material-ui/[email protected] 问题在执行npminstall时看到以下错误:couldnot......
  • React报错之Element type is invalid
    总览产生"Elementtypeisinvalid--expectedastring(forbuilt-incomponents)oraclass/function(forcompositecomponents)butgot"错误有多个原因:在导入......
  • MAUI新生5.3-样式外观:触发器Trigger
    MAUI的触发器,提供了在运行时动态更改控件样式的方法。在Blazor或Vue中,可以通过三元表达式或绑定class来轻松实现,而MAUI则相对麻烦些,需要通过触发器来实现。触发器,其实就是......
  • 在springboot项目里配置ReactiveRedisTemplate
    配置pom.xml: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis-reactive</artifactId> </dependency> ......
  • #yyds干货盘点# react笔记之学习之创建表单
    前言我是歌谣我有个兄弟巅峰的时候排名c站总榜19叫前端小歌谣曾经我花了三年的时间创作了他现在我要用五年的时间超越他今天又是接近兄弟的一天人生难免坎坷大不了从......