React-阻止事件冒泡

react中分为合成事件、原生事件

  • 合成事件:
    在jsx中直接绑定的事件,如
<a ref="aaa" onClick={(e)=>this.handleClick(e)}>更新</a>
  • 原生事件:
    通过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');
});

阻止冒泡事件分三种情况

- 阻止合成事件间的冒泡,用e.stopPropagation(),通过把e传出来;

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,()=>{});

- 阻止合成事件与最外层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,()=>{});

- 阻止合成事件与除最外层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,()=>{});
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • React项目中遇到需要阻止冒泡的需求,觉得这是一个之前没有被发现的坑,总结在此,以备后查! 一,背景 世纪初的网...
    春木橙云阅读 9,743评论 0 4
  • 1. 场景 父组件是个左右可滑动的组件,子组件是可左右滑动的图片展示。功能是手指左右滑动时可页面切换,但是在滑动图...
    捡了幸福的猪阅读 3,411评论 0 3
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 27,720评论 1 45
  • 版权声明:本文为博主原创文章,未经博主允许不得转载。 PS:转载请注明出处作者:TigerChain地址:http...
    TigerChain阅读 8,420评论 1 9
  • 杨树枝干枯了,支支拉拉挺立在簌簌寒风中,呼呼呼作响。天空灰蒙蒙的,看不出这个阴郁的冬天是什么颜色。 干裂的河床沟壑...
    星期八的夜阅读 400评论 2 3