美文网首页
React合成事件阻止冒泡

React合成事件阻止冒泡

作者: RoyChina | 来源:发表于2020-10-28 15:54 被阅读0次

最近在研究react、redux等,网上找了很久都没有完整的答案,如果对你有用就关注一下,以后都会有干货分享的,谢谢。

首先,要知道再react中的合成事件和原生事件之间的区别。
1、合成事件

在jsx中直接绑定的事件,如

<a ref="aaa" onClick={(e)=>this.handleClick(e)}>更新</a>

这里的handleClick事件就是合成事件

2、原生事件

通过js原生代码绑定的事件,如

document.body.addEventListener('click', e => {
  // 通过e.target判断阻止冒泡
  if (e.target && e.target.matches('a')) {
    return
  }
  console.log('body')
})

this.refs.update.addEventListener('click', e => {
  console.log('update')
})

3、阻止冒泡事件分三种情况

A、阻止合成事件间的冒泡,用e.stopPropagation();

import React, { Component } from 'react'
import ReactDOM, { findDOMNode } from 'react-dom'

class Counter extends Component {
  constructor(props) {
    super(props)
    this.state = {
      count: 0,
    }
  }

  handleClick(e) {
    // 阻止合成事件间的冒泡
    e.stopPropagation()

    this.setState({ count: ++this.state.count })
  }

  testClick() {
    console.log('test')
  }

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

var div1 = document.getElementById('content')

ReactDOM.render(<Counter />, div1, () => {})

B、阻止原生事件与最外层document上的事件间的冒泡,用

e.nativeEvent.stopImmediatePropagation();
import React, { Component } from 'react'
import ReactDOM, { findDOMNode } from 'react-dom'

class Counter extends Component {
  constructor(props) {
    super(props)

    this.state = {
      count: 0,
    }
  }

  handleClick(e) {
    // 阻止原生事件与最外层document上的事件间的冒泡
    e.nativeEvent.stopImmediatePropagation()

    this.setState({ count: ++this.state.count })
  }

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

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

var div1 = document.getElementById('content')

ReactDOM.render(<Counter />, div1, () => {})

C、阻止合成事件与除最外层document上的原生事件上的冒泡,通过判断e.target来避免

import React, { Component } from 'react'
import ReactDOM, { findDOMNode } from 'react-dom'

class Counter extends Component {
  constructor(props) {
    super(props)

    this.state = {
      count: 0,
    }
  }

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

  componentDidMount() {
    document.body.addEventListener('click', e => {
      // 通过e.target判断阻止冒泡
      if (e.target && e.target.matches('a')) {
        return
      }
      console.log('body')
    })
  }
}

var div1 = document.getElementById('content')

ReactDOM.render(<Counter />, div1, () => {})

相关文章

  • 关于事件冒泡

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

  • React合成事件阻止冒泡

    最近在研究react、redux等,网上找了很久都没有完整的答案,如果对你有用就关注一下,以后都会有干货分享的,谢...

  • react学习笔记1

    1. React合成事件 事件传播与阻止事件传播DOM事件传播分为三个阶段:捕获阶段,目标对象本身,冒泡阶段,ad...

  • react阻止冒泡事件

    文章引用来自: http://www.jianshu.com/p/e0894bd588f4。 1、合成事件 在js...

  • react 阻止事件冒泡

    需求分析: div中嵌套button:点击“报名”按钮,随之子元素和父元素的事件都被触发。js中称之为冒泡...

  • 微信小程序中bind和catch的区别

    bindtap 冒泡事件,事件绑定不会阻止冒泡事件向上冒泡catchtap 非冒泡事件, 事件绑定阻止冒泡事件...

  • --

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

  • React合成事件中,如何正确阻止事件冒泡

    react事件是合成事件,即最终会将事件代理到documet对象上,为了提高性能。一个典型的场景是页面弹出对话框,...

  • wepy基础知识

    1、bind事件绑定不会阻止冒泡事件向上冒泡,catch事件绑定可以阻止冒泡事件向上冒泡。https://deve...

  • stopPropagation和stopImmediatePro

    都可以阻止事件冒泡(子元素向父元素冒泡) stopImmediatePropagation阻止事件冒泡并且阻止相同...

网友评论

      本文标题:React合成事件阻止冒泡

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