React合成事件与原生事件的机制冲突
场景,当在某组件/dom节点绑定事件时,如果此时document也绑定了事件,则会产生冒泡,触发document事件。
阻止冒泡:
原生场景
1 | <body> |
原生场景下只需要对你想触发的元素监听并触发e.stopPropagation()即可组织冒泡;
react场景
首先我们看到如果在react中同样使用e.stopPropagation(),会有什么效果?
1 | class Home extends Component { |
结果是:’原生outClick’, ‘btn Click’,’document click’;
结论是:e.stopPropagation()只能组织合成事件的冒泡,不能阻止原生事件的冒泡,更不能阻止原生document事件。
这里先暂时提一下合成事件与原生事件
1 | // react 合成事件, dispatchEvent里面执行回调函数 |
通过dispatchEvent分发注册的函数是挂载在document上的===相当于一开始都注册在document上,然后通过docuement的dispatchEvent来进行分发。
怎么阻止document触发呢?
1 | class Home extends Component { |
e.nativeEvent.stopImmediatePropagation(),dispatchEvent里的stopImmediatePropagation可以使得绑定在document上的其他事件不会被触发;值得注意的是,并不会阻止其他父级节点冒泡;如果想要阻止全部冒泡事件,还是通过ref获取节点并监听事件阻止。