react事件

作者: yoona幻尘 | 来源:发表于2019-06-03 20:41 被阅读14次

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

我们在react组件中常见onClick={},这个其实就是合成事件,并且和原生事件onclick十分相似,看下面的例子

class Test extends Component {
    constructor() {
        super(arguments);
        this.onReactClick.bind(this);
    }
    componentDidMount() {
        const parentDom = ReactDOM.findDOMNode(this);
        const childrenDom = parentDom.queneSelector(".button");
        childrenDom .addEventListen('click', this.onDomClick, false);
    }
    onDomClick() {  // 事件委托
        console.log('Javascript Dom click');
    }
    onReactClick() {  // react合成事件
        console.log('React click');
    }
    render() {
        <div>
            <button className="button" onClick={this.onReactClick()}>点击</button>
        </div>
    }
}

componentDidMount里对button进行的操作,就是原生事件,并且原生事件是快于合成事件的。

那么React合成事件和原生事件的区别在哪呢?仅仅只是使用方式吗?
事实上,React并不是将click事件直接绑定在dom上面,而是采用事件冒泡的形式冒泡到document上面,然后React将事件封装给正式的函数处理运行和处理。如果DOM上绑定了过多的事件处理函数,整个页面响应以及内存占用可能都会受到影响。React为了避免这类DOM事件滥用,同时屏蔽底层不同浏览器之间的事件系统差异,实现了一个中间层——SyntheticEvent

当用户在为onClick添加函数时,React并没有将Click事件绑定在 DOM上面。
而是在document处监听所有支持的事件,当事件发生并冒泡至document处时,React将事件内容封装交给中间层SyntheticEvent(负责所有事件合成)
所以当事件触发的时候,对使用统一的分发函数dispatchEvent将指定函数执行。

那么对于原生事件呢?React 也提供了完备的生命周期方法,其中componentDidMount会在组件已经完成安装并且在浏览器中存在真实的 DOM后调用,此时我们就可以完成原生事件的绑定。但是要注意的是,React并不会自动管理原生事件,所以需要我们在卸载组件的时候注销掉原生事件。

有两个需要注意的地方:

  • 不要将合成事件与原生事件混用
  • 通过e.target判断来避免

阻止事件冒泡

(1)阻止合成事件间的冒泡,用e.stopPropagation();
(2)阻止合成事件与最外层document上的事件间的冒泡,用e.nativeEvent.stopImmediatePropagation();
(3)阻止合成事件与除最外层document上的原生事件上的冒泡,通过判断e.target来避免

componentDidMount() { 
  document.body.addEventListener('click', e => {   
     if (e.target && e.target.matches('div.code')) {  
        return;    
      }    
      this.setState({   active: false,    });   }); 
 }

相关文章

  • 【React进阶系列】史上最全React事件机制详解

    框架总览 ? DOM事件流的三个阶段 ? 关于React事件的疑问? React事件绑定机制? React事件和原...

  • 2018-11-07 react 事件处理

    react事件处理和dom事件处理是相似的。 react: Dom: 所以: React事件绑定属性的命名采用驼峰...

  • 【React深入】React事件机制

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

  • React基础(6) -- 事件处理

    React 事件处理 React 元素的事件处理和 DOM 元素类似。但是有一点语法上的不同: React 事件绑...

  • ReactJS_06 React 事件处理

    React 事件处理 React 元素的事件处理和 DOM 元素类似。但是有一点语法上的不同: React 事件绑...

  • React 事件处理

    React 事件处理 React 元素的事件处理和 DOM 元素类似。但是有一点语法上的不同: React 事件绑...

  • React 事件

    React 事件 React 自己维护了自己的事件, 已经对事件进行封装解决了浏览器兼容的问题 React 使用了...

  • React 事件处理机制

    React在处理事件和HTML中JS处理事件不同,本文介绍React中的事件处理机制。React中不同通过返回fa...

  • js函数防抖、节流实现

    React中使用防抖函数和节流函数 在React事件调用时,React传递给事件处理程序是一个合成事件对象的实例。...

  • react文档——事件处理

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

网友评论

    本文标题:react事件

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