[フロントエンド] React.jsで、onClickイベントを親要素に伝播させない方法
こんにちは、@yoheiMuneです。
React.jsでイベントバブリングを抑止する方法を、ブログに書きたいと思います。
 
例えば、
最後になりますが本ブログでは、フロントエンド、サーバー、Swift、PHP、Node.js、Python、Java、Linux、インフラ、Go言語、機械学習、などの技術トピックを発信をしていきます。「プログラミングで困ったその時の、解決の糸口に!」そんな目標でブログを書き続けています。ぜひ、本ブログのRSSやTwitterをフォローして貰えたら嬉しいです ^ ^
最後までご覧頂きましてありがとうございました!
React.jsでイベントバブリングを抑止する方法を、ブログに書きたいと思います。
 
目次
何が問題か
イベントバブリングを抑止しないと、クリックされた要素の親の要素のClickイベントまで発火してしまいます。例えば、
ul -> liの親子関係のあるDOMがあるとします。
class Greeting extends React.Component {
  onClickUl(e) {
    console.log('<ul> was clicked.')
  }
  onClickLi(e) {
    console.log('<li> was clicked.')
  }
  
  render() {
    return (
      <ul onClick={this.onClickUl}>
        <li onClick={this.onClickLi}>Good morning.</li>
        <li onClick={this.onClickLi}>Hello.</li>
        <li onClick={this.onClickLi}>Good night.</li>
      </ul>
    )
  }
}
この時li要素をクリックすると、コンソールに以下の内容が出力されます。<li> was clicked. <ul> was clicked.
liをクリックしたのに、その親のulのClickイベントまで発火していることがわかります。React.jsでイベントバブリングを抑止する方法
jQueryなどのイベント処理ではreturn faluseとすることでイベントバブリングを抑止する(=親要素のclickイベントは発火させない)ことができました。Reactではe.stopPropagation()を利用します。
class Greeting extends React.Component {
  onClickUl(e) {
      console.log('<ul> was clicked.')
  }
  onClickLi(e) {
      e.stopPropagation()  // ** コード追加 **
      console.log('<li> was clicked.')
  }
  
  render() {
    return (
        <ul onClick={this.onClickUl}>
        <li onClick={this.onClickLi}>Good morning.</li>
        <li onClick={this.onClickLi}>Hello.</li>
        <li onClick={this.onClickLi}>Good night.</li>
        </ul>
    );
  }
}
これでliのClickイベントだけ発火し、親要素(ul)のClickイベントは発火しなくなりました。デモ環境
今回の内容をFiddleで動かすことができます。ご参照ください。最後に
こういうちょっとした知識の積み上げが、高速コーディングにつながるのかなと思う今日この頃。今後もReactについてもたくさん記事を書きたいと思います。最後になりますが本ブログでは、フロントエンド、サーバー、Swift、PHP、Node.js、Python、Java、Linux、インフラ、Go言語、機械学習、などの技術トピックを発信をしていきます。「プログラミングで困ったその時の、解決の糸口に!」そんな目標でブログを書き続けています。ぜひ、本ブログのRSSやTwitterをフォローして貰えたら嬉しいです ^ ^
最後までご覧頂きましてありがとうございました!
 
  
