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

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

新規登録して質問してみよう
ただいま回答率
85.49%
React.js

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

Q&A

解決済

1回答

2875閲覧

コンストラクタでbindした関数への引数指定する方法

keikoo

総合スコア7

React.js

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

0グッド

0クリップ

投稿2018/04/16 23:14

編集2018/04/16 23:17

初めまして。

コンストラクタでbindした関数への引数を指定する方法を教えていただけないでしょうか。
現在アサインされているプロジェクトで React のパフォーマンスチューニングに取り組んでおります。

Webで調べたところ下記のようなアロー関数、bindの使い方ではレンダリングされる度に関数が作成されてしまいパフォーマンスに影響すると・・・。

javascript

1render() { 2 const param = 'foo'; 3 return <button onClick={() => this.handleClick(param)}>Click Me</button>; 4}

javascript

1render() { 2 const param = 'foo'; 3 return <button onClick={this.handleClick.bind(this, param)}>Click Me</button>; 4}

対策として下記のようにコンストラクタで関数をbindしておき、onClickイベントにはbind済みの関数の参照を渡すことによってレンダリングされる度に関数が作成されるということはなくなると学びました。

javascript

1constructor(props) { 2 super(props); 3 this.handleClick = this.handleClick.bind(this); 4} 5 6render() { 7 const param = 'foo'; // param はどのように handleClick 関数に渡す? 8 return <button onClick={this.handleClick}>Click Me</button>; 9}

ただ、この方法では変数 param を handleClick に渡す方法が思いつきません。
こちらどのような書き方をすれば handleClick に param を引数として渡せるのでしょうか?

以上、よろしくお願いいたします。

https://reactjs.org/docs/faq-functions.html
https://medium.freecodecamp.org/react-binding-patterns-5-approaches-for-handling-this-92c651b5af56

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

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

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

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

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

guest

回答1

0

ベストアンサー

constructor(props) { super(props); this.handleClick = this.handleClick.bind(this); } handleClick(event) { console.log(event.target.getAttribute('data-message')); // or // console.log(event.target.dataset.message); } render() { const message = 'message'; return ( <button data-message={message} onClick={this.handleClick}>Hello</button> ) }

やるとしたら、こんな感じですかね?

こちらどのような書き方をすれば handleClick に param を引数として渡せるのでしょうか?

この問いに対して素直に答えると、どうしてもthis.handleClick.bind(this, param)のようにならざるを得ないと思います。(または、これに類似したほぼ同じようなこと)

引数に与えたい値が動的なものではなく、あらかじめ決まっている固定のものであれば、constructorの中で、this.handleClick = this.handleClick.bind(this, 'message')のようにして、事前に引数に値をセットしてあげることもできると思います。

投稿2018/04/17 00:34

編集2018/04/17 00:52
HayatoKamono

総合スコア2415

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

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

keikoo

2018/04/17 00:48

ご返信ありがとうございます。 なるほど、attributeに値を指定してハンドラ内からその値にアクセスするのですね。 関数の引数に直接指定する方法はなさそうですね。 パフォーマンスチューニングとしては何も問題ないためこの方法を利用させていただきます。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問