[フロントエンド] 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をフォローして貰えたら嬉しいです ^ ^
最後までご覧頂きましてありがとうございました!