まとめ
- ステートのバケツリレーに疲れたらRecoilを使おう
- 導入は超かんたんだった
- 思ったより
useState
に近くて驚いた - 全てのプロジェクトではいらなさそう
- とりあえずやってみる精神は大切
バケツリレーの限界
Reactを使ってアプリ開発するとき、必須のフックといっても過言じゃないuseState
。
私は今までuseState
を使ってステート管理してきました。
グローバルステートを使っていなかったのでステート管理を複数のコンポーネントでしたいときは、一番上の親コンポーネントでステートを定義して子コンポーネントにprops
として受け渡していました。
私は今までコンポーネントのネストが多くても3つまでだったため、これでも平気でした。
しかし、ユーザー管理をするアプリケーションを作成したときにバケツリレーがしんど過ぎて困ってしまいました。
ここで初めてuseContext
を知り、しばらくはこれを使っていました。しかしuseContext
を使うとcontext
が変更されるたびに親コンポーネントも再レンダリングされることを知りました。またcontext
の数だけ_app.jsx
をプロバイダーで囲うのが嫌になりしました。
なので私はもっと楽にグローバルステートを管理したいと思うようになりました。
そこで前々から聞いていた、Recoilに入門することにしました。
正直Reduxを学ぼうか迷ったのですが、ReduxではStore
ですべてのステートを管理することのリスクや、トレンドなどからRecoilが選ばれました。
いざ入門
さっそくグローバルなステートを管理してやろう、と思い導入しました。
私はNext.js
に導入したのでNext.js
ベースで説明していきます。基本的にどのReactプロジェクトでも行けると思います。
npm i recoil
インストールしたら以下の作業を行います。
_app.jsx
でコンポーネントをRecoilRoot
で囲むsrc
ディレクトリの下にStates
ディレクトリを作成します(好みによる)- ファイルを作成し
Atom
でステートを定義する - 任意の場所で呼び出す
軽く説明。
まず_app.jsx
でRecoilRoot
を以下のように呼び出します。
import '@/styles/globals.css';
import { RecoilRoot } from 'recoil';
export default function App({ Component, pageProps }) {
return (
<RecoilRoot>
<Component {...pageProps} />
</RecoilRoot>
)
};
次に/src/States
ディレクトリを作成します。
作成出来たらステートを定義するファイルを作成します。
userSessionState
を定義したければuserSessionState.js
という名前が良いでしょう。
実際にやってみましょう!
import { atom } from "recoil";
export const userSessionState = atom({
key: "userSessionState",
default: false,
});
default
で初期値を設定できます。
それではグローバルステートを使ってみましょう。
ほとんどuseState
と同じように使うことが出来ます。
ただしuseState
とは違い、ステートだけ・ステートを更新する関数だけをそれぞれ呼び出すことが可能です。
const [userSession, setUserSession] = useRecoilState(userSessionState);
const userSession = useRecoilValue(userSessionState); // ステートの取得のみ可能
const setUserSession = useSetRecoilState(userSessionState); // ステートの更新のみ可能
useState
でい う以下のような感じですね。
ステート定義だけしちゃって、hooksに"Recoil"って付いただけじゃん!!
思ったよりも簡単でした。
const [userSession, setUserSession] = useState(false);
Recoilで呼び出しているhooksの引数に、定義してあげたグローバルステートをぶち込むことで使えるようになります。
ありがたいですね。
プロジェクトに最初から組み込むべき?
ご覧の通り、めちゃくちゃ楽ちんに導入できたRecoil。
グローバルステート管理がこんなに簡単にできるなら、最初からプロジェクトに組み込んでもよさそうです。
見出しの問いに対する私の答えはNoです。
何故か?
- 簡単に導入できるなら後から必要になってからでも良い
- なるべくグローバルステートを使わないようにする
- ボイラーテンプレートとなるから使わなくて済むなら使わない
こんな感じの理由です。
よく「変数のスコープが狭ければ狭いほど良い」と言う言葉を聞きますが、ステートも基本的には一緒だと思います。
あとファイルサイズが肥大化しちゃうので、使わなくて済むなら使わないようにするべきでょう。
ぶっちゃけパーフォンマンスのことを考えないといけないので面倒くさいですが、面倒くさくても改善できるならやらないといけないです。
また、パフォーマンスのことを考えないといけないおかげで、頭を使ってプログラミングできるので楽しいですね。
今回Recoilを触る前は「触ってみたいけど難しそうだしな~時間採らないといけないしな~」と腰が引けてました。
しかし使うキッカケが出来て、実際使ってみたらとても便利や、と気づけました。
なので今回は「とりあえずやってみよう」の大事さを確認できたのも収穫です。
なので新しい技術を取り組むときは思い切って触ってしまったほうが良いと思います!
(ご利用は計画的に)をちょっと頭に入れておけば大丈夫だと思います。
最後は自分の感想になりましたが、以上Recoilに入門してみた記事でした!!
バイバイ👋