美文网首页
React 事件的一些 tips

React 事件的一些 tips

作者: 472abb2e4941 | 来源:发表于2018-12-08 23:16 被阅读75次

翻译总结来自 https://fortes.com/2018/react-and-dom-events/

我们知道在 react 应用中应该尽量使用 React 的事件,这样有更高效的性能,不容易内存泄露等等优点。但是在某些情况你不得不使用原生的事件,最常见的情况可能就是你希望点击 document 任意一处,去触发某个组件的 setState 使得其消失,比如 dropdown 、portal、popover 啊。当原生事件和 React 事件混合使用的时候,如何达到预想的效果,如何去阻止原生事件或者 React 事件的变得尤为重要。

首先我们知道在 React element 上绑定事件并不是在对应 dom 节点上绑定一个原生事件,而是当事件冒泡到 document, React 在 document
监听这个事件然后派发自己的 SyntheticEvent 冒泡通过整个 React component tree。如果你使用 Portal, React 甚至能智能的 route 事件冒泡的路径(而 DOM 事件只能沿着 DOM 节点往上冒泡 )

这里有两个关键,一个是绑定在 document 对象上,一个是通过原生事件的冒泡,所以我们可以:

  1. 在原生事件冒泡到 document 上之前,我们可以通过原生事件的 e.stopPropagation() 阻止事件继续冒泡到 document 上,这样 React 就感受不到事件的发生,可以说我们阻断了 React 事件,请看下面:
      <App onClick={onAppClick}>
        <Button onClick={onButtonClick} />
      </App>

     // 事件应该先经过 body 然后到 document,所以我们在 body上按下面绑定,App 和 Button 上的 React 事件将不会触发
     document.body.addEventListener('click', e => e.stopPropagation())
  1. 如果你希望先执行 React 事件的 handler,再执行你自己的原生事件的 handler,根据事件冒泡顺序,你可以在 document 或者 window对象上绑定你的 handler。这里有个前提,你绑定的 handler 必须在 React Tree mount 之后, 例如在 componentDidMount 之后绑定。

  2. 事件的传播经历三个阶段:捕捉、定位、冒泡。所以当你在捕捉阶段使用 stopPropagation() 阻止事件传播时,事件将不会经历冒泡,这种情况 React 也不会感知到任何事件,请看下面:

// 仅仅是为了解释所以用了 字符串形式的 ref
      <App onClick={onAppClick} ref='app'> 
        <Button onClick={onButtonClick} />
      </App>

// 伪代码:这么做 onAppClick 和 onButtonClick 也不会触发
this.app.addEventListener('click', e => e.stopPropagation(), true)

这里还有一个更细致的 demo:https://jsfiddle.net/fortesdotcom/n5u2wwjg/37487/

最后,如果你通过这个 demo 能预测到所有结果,那么恭喜你,对事件的机制可能有了更进一步的掌握,随手能写出属于你自己的 dropdown 组件等等。

相关文章

  • React 事件的一些 tips

    翻译总结来自 https://fortes.com/2018/react-and-dom-events/ 我们知...

  • react文档——事件处理

    事件处理 React 元素的事件处理和 DOM 元素的事件处理非常相似。但也有一些语法差异: React 事件使用...

  • 关于RN的flexbox tips

    flexbox 日常积累的小tips Tips react 宽度基于pt为单位, 可以通过Dimensions 来...

  • React中的事件模型

    React事件模型跟在原生DOM元素的事件模型非常相似。但是有一些语法上的区别: React 事件使用驼峰命名,而...

  • React处理事件

    通过 React 元素处理事件跟在 DOM 元素上处理事件非常相似。但是有一些语法上的区别: React 事件使用...

  • react-webpack-antd--环境篇

    Tips [React Error]: Target container is not a DOM element...

  • React 处理事件

    用 React 元素处理事件和在DOM元素里处理事件非常相似。有一些语法差异: React 事件使用驼峰式命名,而...

  • React性能优化必知必会

    tips:欢迎关注我在github的博客点击查看 。 使用React.pureComponent,React.me...

  • 绑定事件

    在react的elements上绑定事件和在dom上绑定事件极为相似,但是还是有一些语法上的不同:** react...

  • 处理事件

    使用React元素处理事件和在DOM元素上处理事件非常相似。有一些语法差异: React事件使用驼峰式命名,而非小...

网友评论

      本文标题:React 事件的一些 tips

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