文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

React中的合成事件怎么实现

2023-07-05 04:45

关注

这篇文章主要介绍了React中的合成事件怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇React中的合成事件怎么实现文章都会有所收获,下面我们一起来看看吧。

1 事件三个阶段 捕获、目标、处理 (具体百度,后面有空补全)

2 示例

import React from "react"; class Test extends React.Component {  parentRef;  childRef;  constructor(props) {    super(props);    this.parentRef = React.createRef();    this.childRef = React.createRef();  }  componentDidMount() {    document.addEventListener(      "click",      () => {        console.log(`document原生事件捕获`);      },      true    );    document.addEventListener("click", () => {      console.log(`document原生事件冒泡`);    });    this.parentRef.current.addEventListener(      "click",      () => {        console.log(`父元素原生事件捕获`);      },      true    );    this.parentRef.current.addEventListener("click", () => {      console.log(`父元素原生事件冒泡`);    });    this.childRef.current.addEventListener(      "click",      () => {        console.log(`子元素原生事件捕获`);      },      true    );    this.childRef.current.addEventListener("click", () => {      console.log(`子元素原生事件冒泡`);    });  }  handleParentBubble = () => {    console.log(`父元素React事件冒泡`);  };  handleChildBubble = (e) => {    console.log(`子元素React事件冒泡`);  };  handleParentCapture = () => {    console.log(`父元素React事件捕获`);  };  handleChileCapture = () => {    console.log(`子元素React事件捕获`);  };  render() {    return (      <div        ref={this.parentRef}        onClick={this.handleParentBubble}        onClickCapture={this.handleParentCapture}      >        <div          ref={this.childRef}          onClick={this.handleChildBubble}          onClickCapture={this.handleChileCapture}        >          事件处理测试        </div>      </div>    );  }} export default Test;

执行顺序

React中的合成事件怎么实现

只留子元素修改代码

import React from "react"; class Test extends React.Component {  parentRef;  childRef;  constructor(props) {    super(props);    this.parentRef = React.createRef();    this.childRef = React.createRef();  }  componentDidMount() {    document.addEventListener(      "click",      () => {        console.log(`document原生事件捕获`);      },      true    );    document.addEventListener("click", () => {      console.log(`document原生事件冒泡`);    });    // this.parentRef.current.addEventListener(    //   "click",    //   () => {    //     console.log(`父元素原生事件捕获`);    //   },    //   true    // );    // this.parentRef.current.addEventListener("click", () => {    //   console.log(`父元素原生事件冒泡`);    // });    this.childRef.current.addEventListener(      "click",      () => {        console.log(`子元素原生事件捕获`);      },      true    );    this.childRef.current.addEventListener("click", () => {      console.log(`子元素原生事件冒泡`);    });  }  // handleParentBubble = () => {  //   console.log(`父元素React事件冒泡`);  // };  handleChildBubble = (e) => {    console.log(`子元素React事件冒泡`);  };  // handleParentCapture = () => {  //   console.log(`父元素React事件捕获`);  // };  handleChileCapture = () => {    console.log(`子元素React事件捕获`);  };  render() {    return (      <div        ref={this.childRef}        onClick={this.handleChildBubble}        onClickCapture={this.handleChileCapture}      >        事件处理测试      </div>    );    return (      <div        ref={this.parentRef}        onClick={this.handleParentBubble}        onClickCapture={this.handleParentCapture}      >        <div          ref={this.childRef}          onClick={this.handleChildBubble}          onClickCapture={this.handleChileCapture}        >          事件处理测试        </div>      </div>    );  }} export default Test;

React中的合成事件怎么实现

document原生事件捕获--》子元素React事件捕获--》子元素原生事件捕获--》子元素原生事件冒泡--》子元素React事件冒泡--》document原生事件冒泡

从这个执行顺序来看,react事件捕获执行比原生事件捕获早,但是原生事件冒泡执行比react事件冒泡快。

所有的react捕获事件执行完毕之后才会去执行原生的捕获事件(document原生事件捕获最先执行)

3 子元素阻止react事件冒泡

e.stopPropagation();

import React from "react"; class Test extends React.Component {  parentRef;  childRef;  constructor(props) {    super(props);    this.parentRef = React.createRef();    this.childRef = React.createRef();  }  componentDidMount() {    document.addEventListener(      "click",      () => {        console.log(`document原生事件捕获`);      },      true    );    document.addEventListener("click", () => {      console.log(`document原生事件冒泡`);    });    this.parentRef.current.addEventListener(      "click",      () => {        console.log(`父元素原生事件捕获`);      },      true    );    this.parentRef.current.addEventListener("click", () => {      console.log(`父元素原生事件冒泡`);    });    this.childRef.current.addEventListener(      "click",      () => {        console.log(`子元素原生事件捕获`);      },      true    );    this.childRef.current.addEventListener("click", () => {      console.log(`子元素原生事件冒泡`);    });  }  handleParentBubble = () => {    console.log(`父元素React事件冒泡`);  };  handleChildBubble = (e) => {    e.stopPropagation();    console.log(`子元素React事件冒泡`);  };  handleParentCapture = () => {    console.log(`父元素React事件捕获`);  };  handleChileCapture = () => {    console.log(`子元素React事件捕获`);  };  render() {    return (      <div        ref={this.parentRef}        onClick={this.handleParentBubble}        onClickCapture={this.handleParentCapture}      >        <div          ref={this.childRef}          onClick={this.handleChildBubble}          onClickCapture={this.handleChileCapture}        >          事件处理测试        </div>      </div>    );  }} export default Test;

执行顺序

e.stopPropagation()只能阻止react合成事件的冒泡和document原生事件冒泡,并不能阻止自己和父元素原生事件的冒泡。

React中的合成事件怎么实现

e.nativeEvent.stopImmediatePropagation()只能阻止document原生事件冒泡。

React中的合成事件怎么实现

e.preventDefault()和不执行一样

React中的合成事件怎么实现

e.nativeEvent.stopPropagation()只能阻止document原生事件冒泡。

React中的合成事件怎么实现

如果我们在子原生的原声事件里面阻止冒泡,都阻止了。

import React from "react"; class Test extends React.Component {  parentRef;  childRef;  constructor(props) {    super(props);    this.parentRef = React.createRef();    this.childRef = React.createRef();  }  componentDidMount() {    document.addEventListener(      "click",      () => {        console.log(`document原生事件捕获`);      },      true    );    document.addEventListener("click", () => {      console.log(`document原生事件冒泡`);    });    this.parentRef.current.addEventListener(      "click",      () => {        console.log(`父元素原生事件捕获`);      },      true    );    this.parentRef.current.addEventListener("click", () => {      console.log(`父元素原生事件冒泡`);    });    this.childRef.current.addEventListener(      "click",      () => {        console.log(`子元素原生事件捕获`);      },      true    );    this.childRef.current.addEventListener("click", (e) => {      e.stopPropagation();      console.log(`子元素原生事件冒泡`);    });  }  handleParentBubble = () => {    console.log(`父元素React事件冒泡`);  };  handleChildBubble = (e) => {    console.log(`子元素React事件冒泡`);  };  handleParentCapture = () => {    console.log(`父元素React事件捕获`);  };  handleChileCapture = () => {    console.log(`子元素React事件捕获`);  };  render() {    return (      <div        ref={this.parentRef}        onClick={this.handleParentBubble}        onClickCapture={this.handleParentCapture}      >        <div          ref={this.childRef}          onClick={this.handleChildBubble}          onClickCapture={this.handleChileCapture}        >          事件处理测试        </div>      </div>    );  }} export default Test;

执行顺序

React中的合成事件怎么实现

在子元素的原声事件里面,阻止了所有的冒泡。同时也阻止了react事件。

在父元素原生事件中阻止冒泡

import React from "react"; class Test extends React.Component {  parentRef;  childRef;  constructor(props) {    super(props);    this.parentRef = React.createRef();    this.childRef = React.createRef();  }  componentDidMount() {    document.addEventListener(      "click",      () => {        console.log(`document原生事件捕获`);      },      true    );    document.addEventListener("click", () => {      console.log(`document原生事件冒泡`);    });    this.parentRef.current.addEventListener(      "click",      () => {        console.log(`父元素原生事件捕获`);      },      true    );    this.parentRef.current.addEventListener("click", (e) => {      e.stopPropagation();      console.log(`父元素原生事件冒泡`);    });    this.childRef.current.addEventListener(      "click",      () => {        console.log(`子元素原生事件捕获`);      },      true    );    this.childRef.current.addEventListener("click", (e) => {      console.log(`子元素原生事件冒泡`);    });  }  handleParentBubble = () => {    console.log(`父元素React事件冒泡`);  };  handleChildBubble = (e) => {    console.log(`子元素React事件冒泡`);  };  handleParentCapture = () => {    console.log(`父元素React事件捕获`);  };  handleChileCapture = () => {    console.log(`子元素React事件捕获`);  };  render() {    return (      <div        ref={this.parentRef}        onClick={this.handleParentBubble}        onClickCapture={this.handleParentCapture}      >        <div          ref={this.childRef}          onClick={this.handleChildBubble}          onClickCapture={this.handleChileCapture}        >          事件处理测试        </div>      </div>    );  }} export default Test;

执行顺序

React中的合成事件怎么实现

父元素原生事件中阻止冒泡阻止了react事件

阻止document原生事件的冒泡并不会阻止了react事件

 document.addEventListener("click", (e) => {      e.stopPropagation();      console.log(`document原生事件冒泡`); });

React中的合成事件怎么实现

关于“React中的合成事件怎么实现”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“React中的合成事件怎么实现”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯