React事件和原生事件关系

React 事件机制

  react自身实现了一套自己的事件机制,包括事件注册、事件的合成、事件冒泡、事件派发
  React 和 原始事件是两套机制。 React事件是基于原始事件机制下完成的
  • 结论

    • 原生事件 (捕获阶段-目标元素阶段-冒泡阶段)

      • 绑定在对应dom节点上 在合适时机触发
        document.getElementById().addEventListener('click',()=>{
      
        })
      
    • React重写事件处理机制

      • onClick | onInput | onFocus 等为React事件

      • 所有React 事件 都是在document上对于事件触发后,模拟派发。(新版React 有所不同见下)

        React事件统一绑定在document

      • React 事件是在冒泡阶段触发

      • React 事件触发时机后于原生事件

    • 两者关系

      • React 事件为合成事件SyntheticEvent基于原始Event
      • 原始事件停止冒泡会阻止合成事件触发 , 相反不会
      • 不建议混用。 理解后可以得心应手
  • 运行顺序 (旧版React)

    在这里插入图片描述

    • 顺序
      • 原生事件捕获阶段
      • 原生事件冒泡阶段
      • 原生事件冒泡到document ,开始React 事件执行 模拟冒泡
  • 运行顺序(新版React)
    在这里插入图片描述

    • 顺序
      • 原生事件捕获阶段
      • 原生事件冒泡阶段至React App 根元素
      • React 合成事件 开始从根节点往下进行事件模拟捕获和冒泡
      • 合成事件模拟完毕后,继续原生事件冒泡到document 。
  • 现象理解

    • 事件绑定

        class Test extend React.Component{
          componentDidMount() {
            document.addEventListener('click', e => {
              console.log("document:原生事件");
            });
            document.getElementById('container').addEventListener('click', e => {
              console.log("parent:原生事件");
            });
          }
      
          childClick = (event) => {
            console.log("child:React事件");
          }
      
          parentClick = (event) => {
            console.log("parent:React事件");
          }
      
          render() {
            return (
              <Fragment>
                <div id="container" onClick={this.parentClick}>
                  Event
                  <br/>
                  <div onClick={this.childClick}>Click</div>
                </div>
              </Fragment>
            )
          }
      
        }
      
      • onClick 事件绑定在document ele.addEventListner 绑定在对应dom节点上在这里插入图片描述
      • 点击Click文字后 先执行原生事件完成冒泡后, 再执行React 事件冒泡。
        在这里插入图片描述
  • 原生事件阻止冒泡

    	class Test extends React.component {
    		componentDidMount() {
    			document.addEventListener('click', e => {
     			 	console.log("document:原生事件");
    			});
    			document.getElementById('container').addEventListener('click', e => {
      				console.log("parent:原生事件");
      				e.stopPropagation()
      			});
    	 }
    	  childClick = (event) => console.log("child:React事件");
    	  parentClick = (event) => console.log("parent:React事件")
    	  
    	  render() {
    	   return (
    	   		<Fragment>
    	  			 <div id="container" onClick={this.parentClick}>
    	  			 	Event
    	   				<br />
    	  			 	<div onClick={this.childClick}>Click</div>
    	   			</div>
    	    </Fragment> )
    	    }
    	 }
    
    • 原生事件阻止冒泡 React事件不会执行。反者不行

    在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值