• 技术文章 >web前端 >前端问答

    react的合成事件如何形容

    青灯夜游青灯夜游2022-12-15 19:39:29原创60

    React合成事件是React模拟原生DOM事件所有能力的一个事件对象,即浏览器原生事件的跨浏览器包装器;它根据W3C规范来定义合成事件,兼容所有浏览器,拥有与浏览器原生事件相同的接口。在React中,所有事件都是合成的,不是原生DOM事件,但可以通过“e.nativeEvent”属性获取DOM事件。

    大前端零基础入门到就业:进入学习

    本教程操作环境:Windows7系统、react18版、Dell G3电脑。

    一、合成事件是什么

    React基于浏览器的事件机制自身实现了一套事件机制,包括事件注册、事件的合成、事件冒泡、事件派发等

    在React中这套事件机制被称之为合成事件

    合成事件(SyntheticEvent)

    React 合成事件(SyntheticEvent)是 React 模拟原生 DOM 事件所有能力的一个事件对象,即浏览器原生事件的跨浏览器包装器。它根据 W3C 规范 来定义合成事件,兼容所有浏览器,拥有与浏览器原生事件相同的接口。例如

    const button = <button onClick={handleClick}>按钮</button>

    在 React 中,所有事件都是合成的,不是原生 DOM 事件,但可以通过 e.nativeEvent 属性获取 DOM 事件。 比如:

    const handleClick = (e) => console.log(e.nativeEvent);;
    const button = <button onClick={handleClick}>按钮</button>

    从上面可以看到React事件和原生事件也非常的相似,但也有一定的区别:

    // 原生事件绑定方式
    <button onclick="handleClick()">按钮命名</button>
          
    // React 合成事件绑定方式
    const button = <button onClick={handleClick}>按钮命名</button>
    // 原生事件 事件处理函数写法
    <button onclick="handleClick()">按钮命名</button>
          
    // React 合成事件 事件处理函数写法
    const button = <button onClick={handleClick}>按钮命名</button>

    虽然onclick看似绑定到DOM元素上,但实际并不会把事件代理函数直接绑定到真实的节点上,而是把所有的事件绑定到结构的最外层,使用一个统一的事件去监听。【相关推荐:Redis视频教程编程教学

    这个事件监听器上维持了一个映射来保存所有组件内部的事件监听和处理函数。当组件挂载或卸载时,只是在这个统一的事件监听器上插入或删除一些对象。

    当事件发生时,首先被这个统一的事件监听器处理,然后在映射里找到真正的事件处理函数并调用。这样做简化了事件处理和回收机制,效率也有很大提升。

    二、执行顺序

    关于React合成事件与原生事件执行顺序,可以看看下面一个例子:

    import  React  from 'react';
    class App extends React.Component{
    
      constructor(props) {
        super(props);
        this.parentRef = React.createRef();
        this.childRef = React.createRef();
      }
      componentDidMount() {
        console.log("React componentDidMount!");
        this.parentRef.current?.addEventListener("click", () => {
          console.log("原生事件:父元素 DOM 事件监听!");
        });
        this.childRef.current?.addEventListener("click", () => {
          console.log("原生事件:子元素 DOM 事件监听!");
        });
        document.addEventListener("click", (e) => {
          console.log("原生事件:document DOM 事件监听!");
        });
      }
      parentClickFun = () => {
        console.log("React 事件:父元素事件监听!");
      };
      childClickFun = () => {
        console.log("React 事件:子元素事件监听!");
      };
      render() {
        return (
          <div ref={this.parentRef} onClick={this.parentClickFun}>
            <div ref={this.childRef} onClick={this.childClickFun}>
              分析事件执行顺序
            </div>
          </div>
        );
      }
    }
    export default App;

    输出顺序为:

    原生事件:子元素 DOM 事件监听! 
    原生事件:父元素 DOM 事件监听! 
    React 事件:子元素事件监听! 
    React 事件:父元素事件监听! 
    原生事件:document DOM 事件监听!

    可以得出以下结论:

    对应过程如图所示:

    1.jpg

    所以想要阻止不同时间段的冒泡行为,对应使用不同的方法,对应如下:

    document.body.addEventListener('click', e => {   
        if (e.target && e.target.matches('div.code')) {  
            return;    
        }    
        this.setState({   active: false,    });   }); 
    }

    三、总结

    React事件机制总结如下:

    (学习视频分享:编程基础视频

    以上就是react的合成事件如何形容的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。

    前端(VUE)零基础到就业课程:点击学习

    清晰的学习路线+老师随时辅导答疑

    自己动手写 PHP MVC 框架:点击学习

    快速了解MVC架构、了解框架底层运行原理

    专题推荐:合成事件 React
    上一篇:react怎么改变组件状态 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • ❤️‍🔥共22门课程,总价3725元,会员免费学• ❤️‍🔥接口自动化测试不想写代码?• ie无法识别react怎么办• react更新state方法有哪些• react axios请求拦截怎么实现• 浅析React Hook中useEffecfa函数的使用• react框架什么时候出来的
    1/1

    PHP中文网