美文网首页前端
react && 原生事件

react && 原生事件

作者: xhbisme | 来源:发表于2018-06-02 13:11 被阅读0次

一场由窗口莫名关闭引起的血案

    偶然的一次机会,我把窗口的关闭事件绑在了body上,代码是用react写的。于是,意外发生了。在点击窗口内部内容的时候窗口关闭了,这时候其实在代码中已经阻止冒泡了,绑定事件没有用捕获。于是,就有了下列的探索。

试验一:

这里我不阻止任何事件。

代码1

输出:

此时输出很正常,和原生事件一致。先捕获,后冒泡

输出

试验二:

代码2

输出:

react中,冒泡的时候,可以冒泡到body层,再执行事件。

原生中,先执行事件,然后再网上冒泡。

由此可以知道,原声中,阻止了,就是阻止了。不会再往上冒泡。但在react中,并不是这样的,react事件必须冒泡到body上才能被阻止,因为事件阻止是写在输出clicked地方的。。

react 输出 原生输出

试验三:

我们在点击的上层加个parent。看target是什么。

代码3

输出:

其实这里已经可以看到react的事件执行过程了。

document捕获,body捕获,一直到body冒泡,在body冒泡之后再执行事件函数。其实这里可以断定react是把事件代理到了document上。不然不会等到body冒泡完。

输出

试验四:

这次我们看下react的阻止冒泡阻止了什么。

代码4

看,子组件的事件被执行之后,父组件已经捕获不到冒泡了。所有的这一切,是在body冒泡之后去做的。

输出

试验五:

我们看看react中这句话做了什么。

代码5

输出:

好像,并没有什么乱用。。该输出的都输出了。

输出

为什么呢?这句话的意思是阻止原生事件的冒泡,但是,react真的能阻止吗?当然不能。因为在组件渲染的时候,这个事件就已经绑定在dom标签上了,虽然react在document上代理了冒泡事件处理逻辑,但也仅限于阻止body的冒泡,为什么呢,因为reat合成事件触发的时候,body都冒泡完了。但如果真是这样,为什么这里的document为什么还会输出呢?

试验六:

我们排除一下其它监听的影响。

代码6

输出:

哇,果然是被其它监听影响了。

输出6

总结一下:

    原生事件没什么说的,阻止了就是阻止了。

    react不一样,react是合成事件,而且合成事件的执行时间是在body冒泡结束之后。这可以说明,事件是代理到document上。

相关文章

  • React-阻止事件冒泡

    react中分为合成事件、原生事件 合成事件:在jsx中直接绑定的事件,如 原生事件:通过js原生代码绑定的事件,...

  • React -------合成事件和DOM原生事件混用须知

    React合成事件和DOM原生事件混用须知

  • 【React深入】React事件机制

    关于React事件的疑问 1.为什么要手动绑定this 2.React事件和原生事件有什么区别 3.React事件...

  • 结合React与原生DOM事件实现的滑动删除组件

    零. 前言 React也可以结合原生事件使用,本文阐述了如何结合React与原生DOM事件实现业务上比较常用的滑动...

  • react-原生事件和合成事件的区别

    react-原生事件和合成事件的区别及源码分析 概念 关于 react 合成事件 目的: 封装事件,实现跨平台,把...

  • react事件机制

    (1)react合成事件 react合成事件执行过程: 合成事件与原生事件的区别 1. 写法不同,合适事件是驼峰写...

  • --

    react事件机制 react基于浏览器原生事件机制,封装了一套自己的事件机制,包括事件注册、事件合成、冒泡和捕获...

  • react事件、生命周期

    事件 react中、原生事件绑定丢失this,绑定this写法 jsx中onClosed={ this.handl...

  • react事件

    在react中,存在两种事件,一种是合成事件,一种是原生事件。原生事件很好理解,基于dom的操作是原生事件,那什么...

  • iOS 原生Swift 向 React Native JS 发送

    1需求 在React Native中需要接收原生模块发出的事件来更新UI操作 2思路分析 iOS从原生向React...

网友评论

    本文标题:react && 原生事件

    本文链接:https://www.haomeiwen.com/subject/mycrsftx.html