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

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

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

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

Q&A

解決済

1回答

1115閲覧

Reactにおけるグローバルストアの変更を伴うイベントハンドラの定義場所について

obsult

総合スコア19

React.js

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

0グッド

0クリップ

投稿2021/08/17 03:14

TypeScript + Reactで初めてSPAを作成しています。
使用ライブラリは下記の通りです。

  • ルーティング:React Router
  • ステート管理:Recoil

質問したいのは、グローバルストアの変更を伴うイベントハンドラをどのように定義するのがよいか、ということです。

作成中のアプリは、DB検索機能と一覧表示機能を持っており、下図のページ、コンポーネント構造を持ちます。
イメージ説明

ページ/home および /listは同じ子コンポーネントSearchBoxを持っています。
SearchBoxでイベントが発生した場合、親がどのページであっても同一の処理を行いたいため、各ページのルートAppでイベントハンドラを定義し、Propsとして各ページ経由でハンドラをSearchBoxへ渡しています。
ルートであるAppに定義したのは、次の理由からです

  • 同じ処理を行う関数を何度も定義したくない
  • SearchBoxを処理に依存させたくないためここにはハンドラを定義したくない

しかし、この設計では次の問題があります。

  • Appの肥大化
  • 子コンポーネントにいちいちハンドラ用のPropsを定義して受け渡す必要があり面倒

このような問題を解決するために、良い手段はありますか?
私自身としては、ハンドラを別ファイルに定義し各コンポーネントから参照する方法を考えましたが、Reactコンポーネント外からグローバルストアにアクセスすることに問題はないのか…など懸念があります。

このあたりのベストプラクティスは検索してもなかなか見つけることができず、ご存じの方、あるいは参考書籍等ございましたらご教示いただければありがたく思います。

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

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

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

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

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

maisumakun

2021/08/17 03:46

Contextなどは考えてみましたか?
FKM

2021/08/17 04:23

上の方と同様、useContextが使えるのではないかと思います。
obsult

2021/08/17 06:57

恥ずかしながら、Contextに関数を登録して参照する、という発想がありませんでした。 useContextを使うことで解決いたしました。 アドバイスをいただきありがとうございました。
guest

回答1

0

自己解決

注記欄にてuseContextに関数を登録するという手法を教えていただきました。
おかけでイベントハンドラを別ファイルに切り出すことができ、課題であったルートコンポーネントの肥大化とイベントハンドラのバケツリレーを解決することができました。
コメントをくださったmaisumakunさんFKMさんありがとうございます。

また、ハンドラを複数のContextに切り分けた際、Providerを多重にラップする必要がないよう、下記のリンク先の手法が利用できることもわかりました。
Context Provider をまとめる - Qiita

投稿2021/08/17 06:56

obsult

総合スコア19

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問