質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

2回答

21473閲覧

React.jsでonclickを発火した要素が掴めず困っております

rontec

総合スコア169

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2016/04/02 05:50

react.jsの勉強をしているのでが、clickイベントの扱いがいまいち理解することが出来ません。
例えば以下のようなコードです。

js

1render : function() { 2 var items = this.props.itemList.map((item) => { 3 return <div onClick={this.choiceDiv(key)} key={item.id}> 4 <div className="caption_top"> 5 <span>{item.title}</span> 6 </div> 7 <div className="caption_bottom"> 8 <span>{item.author_name}</span> 9 <span><i className="glyphicon glyphicon-upload"></i>{item.last_update}</span> 10 </div> 11 </div> 12 }); 13 return ( 14 <div> 15 {items} 16 </div> 17 ); 18 }, 19 choiceDiv : function(e) { 20 console.log(e.target); 21 },

一番外側のdivでonclickを発火しているのですが、choiceDivに渡されるeのtargetはonclickイベントをしかけていない子要素になります。
子要素にもonclickが仕込んでありバブリングがとかならまだ分かるのですが、そもそもonclickをしかけていない子要素が
choiceDivのeに設定される理由がよく分かりません。

勿論内側は内側でリンクやボタンを設定してイベントを作る可能性も今後あるのですが、とりあえず目先ちゃんとイベントをしかけた要素が取得出来るようにしたいと考えております。

reactの初歩的な質問で恐縮ですが、ご存知の方がいらしたらご教授願います。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

onClick等で指定するのは関数そのものです。{}の中で関数を評価する(呼び出す、または、実行する、とも言います。いわば()が付いている状態)とその関数が即座に評価(実行)されて、その返り値が指定されたことになります。ですので、()は付けずに、onClick={this.choiceDiv}としてみて下さい。

Reactのイベント処理では、イベントが発生したとき、設定した関数を発生したイベントを引数にして評価します。ですので、choiceDiv(e)はイベントを引数としてとる関数として作る必要があり、eには発生したイベント(RecatではSyntheticEventというオブジェクトです)が入ります。通常のJavScriptのDOMEventのラッパーになっているため、target等で呼び出したときのターゲットが取得できるという仕組みです。

もし、keyを指定して評価したいなら、keyを引数にするのではなく、e.target等から何がクリックされたを辿った方が良いと思います。高階関数やクロージャーを使う方法もありますが、理解してやらないと難しいですので慣れない内はお勧めしません。

投稿2016/04/03 06:18

raccy

総合スコア21735

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rontec

2016/04/03 15:16

アドバイスありがとうございます。 今回mapで繰り返し表示している表の行をクリックさせ、どの行がクリックされたかを取得したいと考えております。 この場合、keyを送るよりどの行がクリックされたかエレメントをchoiceDivのメソッドで取得すべきということでしょうか。 onClick={this.choiceDiv} で指定した場合、やはりchoiceDiv(e)でeに送られるエレメントはonClickが指定されたエレメントではなく、その中の要素のクリックイベントが送られております。 この場合、onclickで指定したエレメントはどのようにいきつくものなのでしょうか。 parentNodeを使おうにも、子の深さも位置によりマチマチなので、使うことが出来ませんでした。
rontec

2016/04/05 14:37

ありがとうございます、出来ました! currentTargetで指定すればよかったのですね…。 ずっと困っていたので、大変助かりました。
guest

0

javascript

1onClick={ (e)=>{ this.choiceDiv(e) } } 2

としたらお望みの挙動になるような気がします

投稿2016/04/03 04:29

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rontec

2016/04/03 15:05

ご意見ありがとうございます。 アドバイス頂いた通り実行してみましたが、残念ながらエラーになってしまいました。 react難しいですね…。
rontec

2016/04/03 15:10

エラーは間違いでした(他のところがエラーになっていました)。 ただ状況は変わらなかったようです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問