国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

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

深入了解React中的合成事件

瀏覽:34日期: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
主站蜘蛛池模板: 久久性感视频 | 天天做天天爱夜夜大爽完整 | 嫩草影院ncyy在线观看 | 国产网友自拍 | 成人性版蝴蝶影院污 | 亚欧美视频| 欧美一及 | 中文字幕无线精品乱码一区 | 欧美粗又大gay69视频 | 日韩黄色毛片 | 欧美成人亚洲欧美成人 | 一级毛片无毒不卡直接观看 | 九九99久久 | 日韩成人精品日本亚洲 | 美女视频黄色的免费 | 99精品视频在线观看 | 国产精品揄拍一区二区久久 | 女人野外小树林一级毛片 | 狠狠色婷婷丁香综合久久韩国 | 99久久精品国产片久人 | 久久免费视频在线观看 | 九九久久精品这里久久网 | 天天看夜夜操 | 欧美成人精品免费播放 | 国产午夜精品久久理论片小说 | 久久香蕉国产线看观看式 | 亚洲高清国产拍精品影院 | 国产精品人伦久久 | 久久99精品久久久久久秒播 | 精品综合久久久久久99 | 欧美成人免费夜夜黄啪啪 | 日本三级香港三级乳网址 | 91久久香蕉国产线看观看软件 | 91精品国产一区二区三区四区 | 免费一级毛片在播放视频 | 国产精品久久久久久久hd | 久久精品亚洲一级毛片 | 97在线公开视频 | 国产在线欧美日韩精品一区二区 | 成人精品视频一区二区在线 | 大臿蕉香蕉大视频成人 |