框架篇-面试题8-React事件绑定原理

React事件绑定采用驼峰命名,合成事件以消除浏览器差异。事件处理在根容器上,利用事件池优化性能,支持事件代理等特性。在组件卸载时自动销毁绑定,建议通过组件方法更新状态。

412d35319e26b9974d77d694315efa2c.jpeg

React中,事件绑定采用驼峰命名方式,而不是DOM元素中的小写字母命名方式,例如:onclick要写成onClick,onchange要写成onChange

React中绑定的事件不是原生事件,而是由原生事件合成的React事件,例如:click事件合成为onClick事件,blur,change,input,keydown,keyup等合成为onChange,React这么做的原因是为了消除不同浏览器之间的差异

React事件的工作原理主要分为以下几个步骤

[1]. 收集事件监听器:React会将事件监听器收集到一个数组中,其中包括目标元素的监听器和根元素的监听器

[2]. 获取所有事件:React会将所有事件名处理成domEventNamereactEventName,即react事件名和dom事件名的对应关系

React会遍历simpleEventPluginEvents列表,将事件名处理成domEventNamereactEventName,例如:click事件对应着onClick事件

一共有75个映射关系,registationNameDependencies则保存着react事件名和依赖事件名之间的关系,例如:onClick事件依赖于click事件

[3]. 特殊处理:对于onDoubleClick,onFocusonBlur这三个事件,他们的reactEventName与对应的domEventName不通,因此需要特殊处理

[4]. 收集合成事件:React会将event对象处理成合成事件,为了消除不同浏览器之间的差异,React设计了normalize函数来将event对象处理成合成事件

如果normalize存在,说明propName对应的属性在合成事件中是一个函数,否则,propName对应的属性是一个原生事件

React v17中,React不会在将事件处理添加到document上,而是将事件处理添加到渲染React树的根DOM容器中

const rootNode = document.getElementById('root');
ReactDOM.render(<App />,rootNode);

React16及之前版本中,React会对大多数事件进行document.addEventListener()操作,React V17开始会通过调用rootNode.addEventListener()来代替

总之,React事件绑定的原理是通过使用合成事件来将浏览器原生事件(如clickkeyup等)封装成一个跨浏览器可靠的事件池

React组件中通过使用事件处理函数来监听这些合成事件。React使用了一些优化策略来提高事件绑定的性能和效率

比如,React会在组件卸载时自动销毁事件绑定。另外,React还支持一些高级特性,如事件代理、事件委托以及捕获和冒泡等。

可以通过event对象来获取事件的相关信息,如事件类型、触发元素、按下的键等

在使用React事件绑定时,应该避免直接操作DOM元素,而应该通过调用组件的setState方法来实现状态更新从而触发重新渲染

68ee134735825955a721936c9620696d.jpeg

(AIhelp智能问答,chatGPT)

18c953e00f9591105254a3742ed67cb6.png

(添加各种社群,拓展人脉关系)

591ddfdce05f5fc67b6164aac4df7c98.jpeg

JS面试题18-说一说网页当中性能优化有哪些性能指标,如何量化

2023-03-14

ef4ed967bf8b9ffb368712e097d8ff2a.jpeg

JS面试题18-说一说网页当中性能优化有哪些性能指标,如何量化

2023-03-13

b3be3683167bd7a6ff406a0582690d4d.jpeg

JS面试题17-比较一下服务端渲染与客户端渲染

2023-03-12

d0c74905c0d64d0b1c769d0d410f67ab.jpeg

JS篇面试题16-Es6中的事件扩展符在什么场景下使用

2023-03-11

dd1dc460abba92a0743355f91dee4615.jpeg

JS篇面试题16-Es6中的事件扩展符在什么场景下使用

2023-03-10

6685558aec17f348b65c24ce7d6b11a0.jpeg
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值