美文网首页
合成事件vs原生事件

合成事件vs原生事件

作者: BubbleM | 来源:发表于2018-01-13 15:14 被阅读77次

场景:由于需求的原因,在React中混用了原生事件,发现e.stopPropagation();阻止事件冒泡无效。后期发现在React中有合成事件和原生事件,这两种事件阻止冒泡的方式不一样。

Q:合成事件
在jsx中直接绑定的事件,如<span className = 's0' onClick = {this.cancel}>取消</span>就是合成事件。

Q:原生事件
domNode.addEventListener('click',self.refClick);

Q:阻止事件冒泡

  • 阻止合成事件间的冒泡,用 e.stopPropagation();
var RepoList = React.createClass({
  getInitialState: function() {
    return {
      count: 0
    };
  },
  handleClick: function(e){
    e.stopPropagation(); // 阻止合成事件间的冒泡
    this.setState({count:++this.state.count});
  },

  testClick: function(){
    console.log('test');
  },

  render: function() {
    return (
        <div ref="test" onClick={()=>this.testClick()}>
          <p>{this.state.count}</p>
          <a ref="update" onClick={(e)=>this.handleClick(e)}>更新</a>
        </div>
    );
  }
});
  • 阻止合成事件与最外层document上的事件间的冒泡,用e.nativeEvent.stopImmediatePropagation();
var RepoList = React.createClass({
  getInitialState: function() {
    return {
      count: 0
    };
  },
  handleClick: function(e){
    e.nativeEvent.stopImmediatePropagation(); // 阻止合成事件和document上的事件冒泡
    this.setState({count:++this.state.count});
  },

  componentDidMount() {
    document.addEventListener('click', () => {
      console.log('document');
    });
  },

  render: function() {
    return (
        <div ref="test">
          <p>{this.state.count}</p>
          <a ref="update" onClick={(e)=>this.handleClick(e)}>更新</a>
        </div>
    );
  }
});

ReactDOM.render(
  <RepoList/>,
  document.getElementById('example')
);
  • 阻止合成事件与除最外层document上的原生事件上的冒泡,通过判断e.target来避免
var RepoList = React.createClass({
  getInitialState: function() {
    return {
      count: 0
    };
  },
  handleClick: function(e){
    this.setState({count:++this.state.count});
  },

  componentDidMount() {
    let dom = this.refs.test;
    dom.addEventListener('click', (e) => {
      if (e.target&&e.target.matches('a')){
        return;
      }
      console.log('test');
    });
  },

  render: function() {
    return (
        <div ref="test">
          <p>{this.state.count}</p>
          <a ref="update" onClick={(e)=>this.handleClick(e)}>更新</a>
        </div>
    );
  }
});

Q:添加到document上的事件如何查看

document.addEventListener('click', () => {
  console.log('document');
});

添加到document上的事件在浏览器上查看的时候需要勾选Ancestors。会同时显示其祖先绑定的事件。

勾选`Ancestors`
勾选`Ancestors`

相关文章

  • React-阻止事件冒泡

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

  • 合成事件vs原生事件

    场景:由于需求的原因,在React中混用了原生事件,发现e.stopPropagation();阻止事件冒泡无效。...

  • react事件机制

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

  • 合成事件

    合成事件 合成事件是浏览器原生事件的跨浏览器的包装器,他拥有浏览器的所有原生事件相同接口,与原生事件不同,是rea...

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

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

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

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

  • react事件

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

  • 关于事件冒泡

    e.stopPropagation() 可以阻止合成事件之间的冒泡 不可以阻止合成事件到原生事件的冒泡 因为Re...

  • React冒泡处理(3):总结篇

    前言 在上周处理了safari浏览器的冒泡问题后又遇到了新的问题 合成事件与原生事件 在react中,事件分为合成...

  • 合成事件中e.persist()方法

    合成事件 合成事件对象实例为SyntheticEvent,他是浏览器原生事件的跨浏览器包装器,能够兼容所有浏览器,...

网友评论

      本文标题:合成事件vs原生事件

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