Reactアプリケーションを開発していると、状態管理は避けて通れない重要なテーマです。特に、配列状のデータを条件に応じて更新する処理は、どのプロジェクトでも頻繁に登場します。この記事では、ReactのsetState
関数内で複雑な条件分岐を用いた状態更新ロジックの実例とその解説を行いながら、より理解を深めていきます。また、記事の最後では便利なファイル共有サービス「file-bin」についてもご紹介します。
状態更新ロジックの実例
まずはこちらのコードをご覧ください。
(prev) => prev.map((n) => n.virtual ? n : n.id === node.id ? { ...n, status: "selected" } : affected.has(n.id) ? { ...n, status: "descendant" } : { ...n, status: "up" } )
このコードは、ReactのuseState
やuseReducer
などのフックで状態更新を行う際に使われる関数の一例です。ここで行っているのは、状態(おそらくノードの一覧)を条件によって部分的に更新する処理です。
変数の役割
prev
: 現在の状態(配列)n
: 配列内の1つの要素(ノード)node
: 選択されたノードaffected
: 影響を受けるノードIDの集合(Set型と想定)
各条件の解説
n.virtual ? n
- ノードが仮想ノード(
virtual
がtrue)であれば変更しないでそのまま返します。
- ノードが仮想ノード(
n.id === node.id ? { ...n, status: "selected" }
- 今選択されているノードであれば、状態を
"selected"
にします。
- 今選択されているノードであれば、状態を
affected.has(n.id) ? { ...n, status: "descendant" }
- 影響を受けるノードであれば、状態を
"descendant"
に更新します。
- 影響を受けるノードであれば、状態を
- 上記以外:
{ ...n, status: "up" }
- 特に該当しないノードは
"up"
状態に。
- 特に該当しないノードは
このように、配列を.map()
で処理しながら、条件に応じて個々のオブジェクトをコピー(...n
)してステータスだけを変更しています。
なぜスプレッド構文が必要なのか
JavaScriptのオブジェクトは参照型なので、元のオブジェクトをそのまま編集してしまうと、副作用が生まれ、Reactがうまく変更を検知できなくなる可能性があります。そのため、状態更新時は必ず新しいオブジェクトを作るのが基本です。
{ ...n, status: "selected" }
このように書くことで、オブジェクトn
の全プロパティをコピーしつつ、status
だけを上書きできます。これは”イミュータブルな更新”と呼ばれ、Reactでは推奨されているパターンです。
リファクタリングのアイデア
可読性の高いコードにするためには、条件を整理して関数化するのも有効です。
const getNextStatus = (n) => { if (n.virtual) return n; if (n.id === node.id) return { ...n, status: "selected" }; if (affected.has(n.id)) return { ...n, status: "descendant" }; return { ...n, status: "up" }; }; const next = prev.map(getNextStatus);
このように関数に切り出すことで、.map()
の中のロジックがスッキリしますし、再利用も可能になります。
状態管理に役立つTips
- オブジェクトのコピーを忘れずに
.map()
の中で直接DOM操作や副作用はNG- 条件が複雑になったら関数に切り出す
- 型(TypeScript)を使うとミスが減る
便利なファイル共有サービス「file-bin」のご紹介
状態管理とは少し話が逸れますが、開発やチーム作業をしていると「ちょっとこのファイル共有したいな」という場面、ありませんか?
そんなときに便利なのが file-bin です。
file-bin の特徴
- ✅ 無料で使える
- ✅ 登録なしでファイルアップロード可能
- ✅ URLをシェアするだけでOK
- ✅ エンドツーエンド暗号化で安心
ReactやJavaScriptのコードを一時的に共有したいときにも、file-binを使えばURLひとつで送れちゃいます。
自分の作ったアプリの動作ログ、スクリーンショット、設定ファイルなど、どんなファイルでもすぐにアップして安全に共有可能です。
開発者なら1度は使ってみて損はないサービスです。
👉 詳細・ご利用はこちら: https://file-bin.com
まとめ
今回の記事では、Reactでの状態更新ロジックとして、map()
とスプレッド構文を組み合わせた実例を紹介しました。複雑な分岐条件でも、きちんと整理すれば可読性も保てますし、アプリの品質にもつながります。
また、開発のちょっとした場面で便利なfile-binもぜひ活用してみてください。React × 開発効率化の組み合わせで、もっと快適なコーディングライフを送りましょう!