標籤:

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

推薦閱讀:

SegmentFault 技術周刊 Vol.11 - React 應用與實踐
怎麼理解 "JSX 表達式總是會當作 ReactElement 執行" ?
用 ReactJs 創建Mac版的 keep
圖解ES6中的React生命周期

TAG:React |