日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

深入了解React中的合成事件

瀏覽:186日期:2022-06-01 11:52:30

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 (      <divref={this.parentRef}onClick={this.handleParentBubble}onClickCapture={this.handleParentCapture}      ><div  ref={this.childRef}  onClick={this.handleChildBubble}  onClickCapture={this.handleChileCapture}>  事件處理測試</div>      </div>    );  }} export default Test;

執行順序

只留子元素修改代碼

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 (      <divref={this.childRef}onClick={this.handleChildBubble}onClickCapture={this.handleChileCapture}      >事件處理測試      </div>    );    return (      <divref={this.parentRef}onClick={this.handleParentBubble}onClickCapture={this.handleParentCapture}      ><div  ref={this.childRef}  onClick={this.handleChildBubble}  onClickCapture={this.handleChileCapture}>  事件處理測試</div>      </div>    );  }} export default Test;

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 (      <divref={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原生事件冒泡,并不能阻止自己和父元素原生事件的冒泡。

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

e.preventDefault()和不執行一樣

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

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

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 (      <divref={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", (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 (      <divref={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事件

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

結論

react捕獲事件快于原生捕獲事件的執行

react冒泡事件慢于原生冒泡事件的執行

原生冒泡事件會阻止react事件。

以上就是深入了解React中的合成事件的詳細內容,更多關于React合成事件的資料請關注其它相關文章!

標簽: JavaScript
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
精品国产欧美日韩| 午夜国产欧美理论在线播放| 精品国产一区二区三区av片| 亚洲一级淫片| 午夜国产欧美理论在线播放| 中文字幕在线视频久| 国产免费播放一区二区| 欧美私人啪啪vps| 蜜臀久久99精品久久久画质超高清 | 国产成人a视频高清在线观看| 欧美日韩亚洲一区三区| 成人亚洲一区| 国产精品99精品一区二区三区∴| 日本在线观看不卡视频| 丝袜亚洲另类欧美| 婷婷六月综合| 欧美日韩国产欧| 福利一区二区| 精品中文在线| 粉嫩av一区二区三区四区五区| 国产精品羞羞答答在线观看| 国产日韩中文在线中文字幕| 国产一卡不卡| 国产精品s色| 麻豆精品少妇| 91亚洲无吗| 欧美偷窥清纯综合图区| 亚洲精品麻豆| 日韩av一区二区在线影视| 日本免费新一区视频| 日韩av在线播放中文字幕| 日韩精品午夜视频| 日本强好片久久久久久aaa| 欧美在线看片| 欧美精品成人| 高清不卡一区| 欧美亚洲国产一区| 日本 国产 欧美色综合| 日韩精选在线| 毛片在线网站| 中文一区在线| 国产精品一在线观看| 亚洲啊v在线| 亚洲自啪免费| 国产日本亚洲| 亚洲午夜精品久久久久久app| 亚洲精品韩国| 国产不卡一区| 免费在线观看精品| 成人在线免费观看网站| 老鸭窝毛片一区二区三区| 国产伦精品一区二区三区在线播放| 欧美国产小视频| 日韩精品一二三| 国产不卡av一区二区| 久久都是精品| 色一区二区三区四区| 久久国产高清| 精品深夜福利视频| 蜜臀精品久久久久久蜜臀 | 欧美专区18| 成人日韩av| 日韩精品一卡二卡三卡四卡无卡| 国产精品对白| 国产精品社区| 色爱综合网欧美| 日韩av一区二区三区| 免费不卡中文字幕在线| 欧美片网站免费| 久久久精品日韩| 欧美一区二区三区免费看| 激情综合在线| 国产一区二区三区四区二区| 中文字幕av一区二区三区人| 色婷婷精品视频| 久久精品资源| 午夜电影一区| 国产精品毛片| 日韩免费av| 久久av日韩| 日韩精品国产欧美| 五月婷婷六月综合| 麻豆视频在线观看免费网站黄| 亚洲精品人人| 久久国产毛片| 国产一区二区三区网| 日本久久一区| 亚洲在线观看| 精品久久亚洲| 日韩高清不卡一区| 爽爽淫人综合网网站| 婷婷成人基地| 91精品国产成人观看| 国产在视频一区二区三区吞精| 日本vs亚洲vs韩国一区三区二区| 国产精品老牛| 99久久激情| 成人免费网站www网站高清| 久久亚洲精品中文字幕| 日韩精品免费一区二区夜夜嗨| 免费精品视频| 国产亚洲在线| 欧美特黄一区| 欧美成人精品| 99免费精品| 午夜欧美巨大性欧美巨大| 美女性感视频久久| 国产免费av一区二区三区| 日韩视频1区| 视频一区日韩| 亚洲乱码视频| 一区二区精彩视频| 天堂成人国产精品一区| 欧美日韩免费观看一区=区三区| 日韩一区二区三区免费播放| 精品国产美女a久久9999| 国产精品亚洲产品| 国产精品国码视频| 麻豆国产一区| 国产精品久久久久77777丨| 亚欧成人精品| 日韩精品91亚洲二区在线观看| 亚洲精品一区二区在线播放∴| 亚洲一区日本| 久久国产99| 蜜桃视频第一区免费观看| 麻豆久久精品| 快she精品国产999| 性色av一区二区怡红| 尤物网精品视频| 狠狠爱成人网| 日韩精品一区二区三区免费观看| 国产超碰精品| 激情婷婷综合| 女主播福利一区| 久久www成人_看片免费不卡| 免费在线成人网| 欧美一区免费| 国产一区二区亚洲| 99精品美女| 丝袜美腿亚洲色图| 欧美亚洲tv| 成午夜精品一区二区三区软件| 亚洲美女久久精品| 视频二区不卡| 99国产精品| 亚洲aa在线| 麻豆传媒一区二区三区| 日本久久综合| 亚洲国产专区校园欧美| 蜜臀av在线播放一区二区三区| 欧美影院视频| 精品视频一二| 999精品一区| 男人的天堂亚洲一区| 日韩二区三区在线观看| 久久av影视| 久久精品免费一区二区三区| 欧美专区18| 久久国际精品| 国产成人精品一区二区三区视频| 久久久成人网| 亚洲综合婷婷| 美女视频一区在线观看| 久久天堂av| 综合激情一区| 韩国女主播一区二区三区| 99久久夜色精品国产亚洲1000部| 亚洲婷婷丁香| 精品淫伦v久久水蜜桃| 99久精品视频在线观看视频| 老司机精品久久| 久久伊人久久| 91久久亚洲| 国产日韩高清一区二区三区在线 | 蜜桃av一区二区在线观看| 91亚洲精品视频在线观看| 日韩国产专区| 日产欧产美韩系列久久99| 一区二区三区四区日本视频| 一二三区精品| 日韩成人亚洲| 欧美天堂在线| 亚洲激情中文在线| 久久一区精品| 中文字幕av一区二区三区人| 激情久久一区二区| 久热精品在线| av在线资源| 欧美日韩网址| 尤物网精品视频| 精品女同一区二区三区在线观看| 亚洲色诱最新| www.51av欧美视频| 亚洲精品乱码| 欧美日韩在线播放视频| 国产精品亚洲一区二区在线观看| 日韩亚洲精品在线| 中文字幕在线官网| 国产精品一线天粉嫩av|