• react阻止冒泡事件,绝对干货


    最近在研究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,()=>{});
  • 相关阅读:
    【秒懂音视频开发】03_重识音频
    【秒懂音视频开发】02_重识声音
    【秒懂音视频开发】01_移动通信技术的发展
    [mysql]错误解决之"Failed to start MySQL Server"
    Ubuntu 将Python从默认的2.7升级到3.* 版本
    宝塔面板后台设置免费SSL证书Let's Encrypt(三)
    Let's Encrypt 证书申请及配置(二)
    快速签发 Let's Encrypt 证书指南(一)
    DJANGO中多种重定向方法使用
    反解法|逆向思维
  • 原文地址:https://www.cnblogs.com/codepen2010/p/6867687.html
Copyright © 2020-2023  润新知