You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
importReactfrom'react';classAppextendsReact.Component{constructor(props){super(props);this.parentRef=React.createRef();this.childRef=React.createRef();}componentDidMount(){console.log("React componentDidMount!");this.parentRef.current?.addEventListener("click",()=>{console.log("原生事件:父元素 DOM 事件监听!");});this.childRef.current?.addEventListener("click",()=>{console.log("原生事件:子元素 DOM 事件监听!");});document.addEventListener("click",(e)=>{console.log("原生事件:document DOM 事件监听!");});}parentClickFun=()=>{console.log("React 事件:父元素事件监听!");};childClickFun=()=>{console.log("React 事件:子元素事件监听!");};render(){return(<divref={this.parentRef}onClick={this.parentClickFun}><divref={this.childRef}onClick={this.childClickFun}>
分析事件执行顺序
</div></div>);}}exportdefaultApp;
输出顺序为:
原生事件:子元素 DOM 事件监听!
原生事件:父元素 DOM 事件监听!
React 事件:子元素事件监听!
React 事件:父元素事件监听!
原生事件:document DOM 事件监听!
面试官:说说React的事件机制?
一、事件
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: