在React
中,事件绑定采用驼峰命名方式,而不是DOM
元素中的小写字母命名方式,例如:onclick
要写成onClick
,onchange
要写成onChange
等
React
中绑定的事件不是原生事件,而是由原生事件合成的React
事件,例如:click
事件合成为onClick
事件,blur
,change
,input
,keydown
,keyup
等合成为onChange
,React
这么做的原因是为了消除不同浏览器之间的差异
React
事件的工作原理主要分为以下几个步骤
[1]. 收集事件监听器:React
会将事件监听器收集到一个数组中,其中包括目标元素的监听器和根元素的监听器
[2]. 获取所有事件:React
会将所有事件名处理成domEventName
和reactEventName
,即react
事件名和dom
事件名的对应关系
React
会遍历simpleEventPluginEvents
列表,将事件名处理成domEventName
和reactEventName
,例如:click
事件对应着onClick
事件
一共有75个映射关系,registationNameDependencies
则保存着react
事件名和依赖事件名之间的关系,例如:onClick
事件依赖于click
事件
[3]. 特殊处理:对于onDoubleClick
,onFocus
和onBlur
这三个事件,他们的reactEventName
与对应的domEventName
不通,因此需要特殊处理
[4]. 收集合成事件:React
会将event
对象处理成合成事件,为了消除不同浏览器之间的差异,React
设计了normalize
函数来将event
对象处理成合成事件
如果normalize
存在,说明propName
对应的属性在合成事件中是一个函数,否则,propName
对应的属性是一个原生事件
在React v17
中,React
不会在将事件处理添加到document
上,而是将事件处理添加到渲染React
树的根DOM
容器中
const rootNode = document.getElementById('root');
ReactDOM.render( ,rootNode);
在React16
及之前版本中,React
会对大多数事件进行document.addEventListener()
操作,React V17
开始会通过调用rootNode.addEventListener()
来代替
总之,React
事件绑定的原理是通过使用合成事件来将浏览器原生事件(如click
、keyup
等)封装成一个跨浏览器可靠的事件池
在React
组件中通过使用事件处理函数来监听这些合成事件。React
使用了一些优化策略来提高事件绑定的性能和效率
比如,React
会在组件卸载时自动销毁事件绑定。另外,React
还支持一些高级特性,如事件代理、事件委托以及捕获和冒泡等。
可以通过event
对象来获取事件的相关信息,如事件类型、触发元素、按下的键等
在使用React
事件绑定时,应该避免直接操作DOM
元素,而应该通过调用组件的setState
方法来实现状态更新从而触发重新渲染
(AIhelp智能问答,chatGPT)
(添加各种社群,拓展人脉关系)
JS面试题18-说一说网页当中性能优化有哪些性能指标,如何量化
2023-03-14
JS面试题18-说一说网页当中性能优化有哪些性能指标,如何量化
2023-03-13
JS面试题17-比较一下服务端渲染与客户端渲染
2023-03-12
JS篇面试题16-Es6中的事件扩展符在什么场景下使用
2023-03-11
JS篇面试题16-Es6中的事件扩展符在什么场景下使用
2023-03-10