-
Notifications
You must be signed in to change notification settings - Fork 1.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
面试官:说说React的事件机制? #186
Comments
阻止合成事件间的冒泡,用e.stopPropagation() 阻止合成事件与最外层 document 上的事件间的冒泡,用e.nativeEvent.stopImmediatePropagation() 阻止合成事件与除最外层document上的原生事件上的冒泡,通过判断e.target来避免 这三句看不懂 |
如果对应的dom原生事件不冒泡的话,react怎么处理呢? |
@willTerner 如果原生事件阻止了冒泡,react 的合成事件也不会执行。原生事件先执行完成之后,才去管合成事件 |
浏览器标准规范了DOM原生事件必须有捕获阶段和冒泡阶段。如果你在某些地方阻止了事件冒泡,React不背这个锅。 |
说说React的事件机制?React17之前:在React中,基于浏览器事件有一套自身的事件机制,包括:事件注册、事件合成、事件派发等,这些事件被称为合成事件。它的所有事件都是挂载在Document对象上,当真实DOM触发时,会冒泡到document上后,再处理react事件,所以会先执行原生事件,再处理react事件,最后再真正执行document上挂载事件。 原生事件→react事件→document挂在事件 React17之后:
|
一、是什么
React
基于浏览器的事件机制自身实现了一套事件机制,包括事件注册、事件的合成、事件冒泡、事件派发等在
React
中这套事件机制被称之为合成事件合成事件(SyntheticEvent)
合成事件是
React
模拟原生DOM
事件所有能力的一个事件对象,即浏览器原生事件的跨浏览器包装器根据
W3C
规范来定义合成事件,兼容所有浏览器,拥有与浏览器原生事件相同的接口,例如:如果想要获得原生
DOM
事件,可以通过e.nativeEvent
属性获取从上面可以看到
React
事件和原生事件也非常的相似,但也有一定的区别:虽然
onclick
看似绑定到DOM
元素上,但实际并不会把事件代理函数直接绑定到真实的节点上,而是把所有的事件绑定到结构的最外层,使用一个统一的事件去监听这个事件监听器上维持了一个映射来保存所有组件内部的事件监听和处理函数。当组件挂载或卸载时,只是在这个统一的事件监听器上插入或删除一些对象
当事件发生时,首先被这个统一的事件监听器处理,然后在映射里找到真正的事件处理函数并调用。这样做简化了事件处理和回收机制,效率也有很大提升
二、执行顺序
关于
React
合成事件与原生事件执行顺序,可以看看下面一个例子:输出顺序为:
可以得出以下结论:
对应过程如图所示:
所以想要阻止不同时间段的冒泡行为,对应使用不同的方法,对应如下:
阻止合成事件间的冒泡,用e.stopPropagation()
阻止合成事件与最外层 document 上的事件间的冒泡,用e.nativeEvent.stopImmediatePropagation()
阻止合成事件与除最外层document上的原生事件上的冒泡,通过判断e.target来避免
三、总结
React
事件机制总结如下:参考文献
The text was updated successfully, but these errors were encountered: