9
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

こちらの記事は金属加工プラットフォームを開発・運用するCatallaxyCatallaxy Advent Calendar 2022の12/2の記事となります。

前提

既存システムではReactのContextを使用しているのですが、使い方があまりよくわかっていなかったので他のライブラリでの置き換えも含めて検討しようと思って調査をしました。

用途としては

  • ログイン状態などのグローバルな状態管理
  • コンポーネント間の狭い範囲での状態管理

の2つで、どちらもデータとしては小さいものです。
使用するデータをシステムでグローバルに管理するような用途は考えていません。
基本的にはコンポーネント間のデータの受け渡しはPropsを経由するので使用頻度はそれほど多くありません。

まずReactのContextについて

既存のコードを読む限り、ReactのContextで一見大丈夫な様に見えました。
なのでReactのContextについて用法・用量の注意点が無いか調べていた所、この記事に行き当たりました。

正しく使う ReactContext - zenn

すると、アンチパターンの1に思いっきり該当していました。
自分が実装したわけでは無いのですがこういう風に実装したい気持ちはめっちゃわかるので、コーディングルールやPRでのチェックで回避しないといけない→それはちょっとなぁとなりました。

他のライブラリを調べる

というわけで他のライブラリがどうなっているかを調べました。
色々な記事を参考にしましたが、ざっくりな分類としては下記のスライドで把握できました。

Reactのトレンドよくわからん P.26 - Speaker Deck

  • Fluxアーキテクチャ
    • Redux
    • Zustand
  • Atomアーキテクチャ
    • Recoil
    • Jotai
  • クエリキャッシュ
    • TanStack Query
    • SWR

また、比較記事として次の記事を参考にしました。

Reactの状態管理で悩む全ての人へ【2022年】 - ramble

Flux

Redux

React Redux

Reduxについては以前別のシステムで使っていたのでなんとなくの印象なのですが、設計・実装が複雑になりがちなので今回の目的には重たいかなと思いました。

Zustand

Zustand

Zustandについて紹介記事を読んでみましたが、Reduxとは違ってシンプルに書けそうな印象でした。
React状態管理ライブラリ Zustandを使ってみた - DevelopersIO

shallow、overwrite辺りの挙動がポイントになりそうですね。

Atom

Recoil

Recoil

Atomのアーキテクチャについては、状態管理する単位が小さくまとめやすいなぁという感想でした。
なので当初はRecoilでよさそうかなぁと思ってました。
懸念材料としては、Atomのキーを管理するコストがかかりそうだなぁというのがありました。

Jotai

Jotai

JotaiはRecoilの懸念材料が無くなったので特に問題がなさそうでした。
複雑な使い方をすると機能が足りないとかという問題が出てくるかもしれませんが、現状の要求にマッチしていると思いました。

結論

現状の要求を考えると、最も懸念点が少ないのでJotaiを使ってみようと思います。

Jotaiに限らず状態管理ライブラリを使った場合に問題が出るのは設計部分だと思うので、それはまた別記事にまとめたいと思います。

9
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?