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

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

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

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

Q&A

解決済

2回答

223閲覧

PureComponentのpropとしてコールバック関数を渡したい

maisumakun

総合スコア145183

React.js

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

0グッド

2クリップ

投稿2019/01/26 08:03

React.jsのレンダリングを効率化する方法としてPureComponentがありますが、PureComponentrenderの際に使うコールバック関数を渡すとしたら、正常に動かすのが難しいのではないかと考えています。

例えば「あるエレメント群のclassNameを生成する関数」をPureComponentが受け取れるようになっていた場合、関数が純粋ならそれで問題ないのですが、関数があるオブジェクトにbindされたメソッドで、そのオブジェクトの状態に応じて返り値が変化するようになっていると、関数自身は変化しないのでPureComponentの再renderは不要と判断されるものの、実際には状態変化しているので再描画しないと整合しない、ということが考えられます。

ひとまず正常動作させるために「PureComponent化を諦める」や「オブジェクトの状態変化に合わせて関数自体を.bindするなどで強制的に状態変化させる」というような方法を思いつきましたが、もっとエレガントな対応法はないでしょうか。

ParentComponent内で生成された複数の値をmapしてChildComponentを生成していて、「ChildComponentで使う、それぞれの値に応じたclassNameを生成する関数」をParentComponentの外側から渡してChildComponentまで引き回している、という状況です。汎用性を高めるためにこのような構造をとっています)

環境

  • React 16.6
  • 対象ブラウザ: IE11、各種モダンブラウザ
  • Redux、SSRなどは未使用

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

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

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

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

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

Meganezaru

2019/01/26 10:18

理解できていなかったら、ごめんなさい・・・ PureComponentにかかわらず、ChildComponent自身のpropsかstateに変化が起こらなければ、renderはコールされないと思うのですが、ここでいうコールバックは、renderから呼び出されて、classNameを返すものなのですよね?もしそうであれば、外部のオブジェクトが変化したことを伝えるpropsが必要なのかも。 いや・・・そんな単純なことを聞きたいんではないですよね・・・PureComponentじゃなければ、動作してるってことなんですよね?(;'∀') 的外しだったらすいません・・・スルーで。
guest

回答2

0

自己解決

結局、React Hooksで作れば、「ある関数が依存する変数の更新に合わせて関数を再作成する」形に自然となるので、問題が自然解決することに気づきました。

jsx

1function FunctionProvidingComponent(props){ 2 const [keys, setKeys] = useState({}); 3 4 // keysを見てclassNameを返す関数 5 const getClassName = useCallback(() => { 6 // keysを使った判定処理(略) 7 }, [keys]); 8 9 return <ChildComponent classNameCallback={getClassName} /> 10}

投稿2019/03/11 00:24

maisumakun

総合スコア145183

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

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

0

ParentComponent内で生成された複数の値をmapしてChildComponentを生成していて、「ChildComponentで使う、それぞれの値に応じたclassNameを生成する関数」をParentComponentの外側から渡してChildComponentまで引き回している、という状況

具体的にどういった状況かコードレベルで確認したく、こちらのコードをこちらで共有いただくことは可能ですか?

maisumakunさんの状況に適してるかは分からないのですが、ChildComponentに対してclassName自体をstringのpropsで渡すという方法は可能ですか?

投稿2019/02/04 03:09

engineer_jp_us

総合スコア100

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問