React 合成事件与原生事件

2020-07-14  本文已影响0人  xiudaozhe

专心搞前端的第14天
在看《深入react技术栈》的时候试了下2.1章的在react中使用原生事件。发现一些写法不好使了,所以查了下文档,顺便粗略看了下事件。在此做下记录。

import React, { Component } from 'react'; 
class NativeEventDemo extends Component {   
  componentDidMount() {          
    this.refs.button.addEventListener('click', e => {   this.handleClick(e);    });   
  }  
  handleClick(e) {    
    console.log(e);   
  }   
  componentWillUnmount() {    
    this.refs.button.removeEventListener('click');   
  }  
  render() {    
    return <button ref="button">Test</button>;   
  } 
}

原书在ref的用法已不再支持,使用React.createRef()后写了示例如下:

import React,{Component} from "react";

class App extends React.Component {
    constructor() {
        super();
        this.outbtnref = React.createRef()
        this.inbtnref = React.createRef()
        this.inClick = this.inClick.bind(this)
        this.outClick = this.outClick.bind(this)
    }

    componentDidMount() {
        this.outbtnref.current.addEventListener('click',(e)=>{
            console.log('out-dom',e)
            // e.stopPropagation()
        })
        this.inbtnref.current.addEventListener('click',(e)=>{
            console.log('in-dom',e)
            e.stopPropagation()
        })
    }
    inClick(e){
        console.log('in-react',e)    //e.nativeEvent获取原生事件
        // e.stopPropagation()
    }

    outClick(e){
        console.log('out-react',e)
    }


    render() {
        return (
            <div ref={this.outbtnref} onClick={this.outClick}>
                <button ref={this.inbtnref} onClick={this.inClick}>按钮</button>
            </div>
        )
    }
}

export default App

在jsx中书写的事件是合成事件,如果要获取原生事件需使用e.nativeEvent。react并没有将真实事件绑定在元素上,而是将真实事件委托至了document中。


图片.png
图片.png

所以如果在原生事件中使用stopPropagation阻止冒泡的话,合成事件不再触发。如果在合成事件中使用stopPropagation。其实使用的并不是原生的stopPropagation。无法阻止原生事件触发。

上一篇下一篇

猜你喜欢

热点阅读