目次
はじめに
今回は React の状態管理ライブラリのrecoil
について解説していこうと思います。
これまでも状態の管理はuseContext
やzustand
は使ってみたことがあったのですが、recoil
を触る機会があったので有名なライブラリだしこの機会に調べてみることにしました。
結論から言うと、これまで他の状態管理ツールを使ったことがあれば割と直感的にわかりやすく使えていい感じでした。
基本的な使い方
それではさっそくrecoil
の基本的な使い方を見ていきましょう!
大きく分けて状態を設定側と使用する側があるので、以下でそれぞれを解説していきます。
インストール
npm install recoil
or
yarn add recoil
アプリケーション内で行う準備
recoil
を使用するのにルートコンポーネントの中をRecoilRoot
で囲んであげます。
import { RecoilRoot } from 'recoil'
function App() {
return (
<RecoilRoot>
<CharacterCounter />
</RecoilRoot>
)
}
設定側
atom
atom
は最小単位の state を宣言します。
key
はユニークな値を設定(アプリケーション全体で一意の)。default
は初期値を設定。
import { atom } from 'recoil'
const atomState = atom({
key: 'atom-key',
default: 0,
})
selector
selector
は atom など他の state の取得と更新をします。
key
はユニークな値を設定(アプリケーション全体で一意の)。get
は引数に他の state を計算や加工をして取得(必須)set
は第一引数に他の state を入れて、第二引数に新しい値をを計算や加工をして更新(オプション)
import { selector } from 'recoil'
const selectorState = selector({
key: 'selector-key',
get: ({ get }) => {
// atomStateで設定したdefaultの0を取得
get(atomState)
},
set: ({ set }, newValue) => {
// 第二引数の値をatomStateに設定
set(atomState, newValue + 1)
},
})
呼び出し側
引数にatom
やselector
といった state を入れて使います。
useRecoilValue
useRecoilValue
は値の取得をします。
import { useRecoilValue } from 'recoil'
export const GetCountValue = () => {
// atomStateの値を取得
const value = useRecoilValue(atomState)
return <div>{value}</div>
}
useSetRecoilValue
useSetRecoilValue
は値の更新をします。
import { useSetRecoilState } from 'recoil'
export const SetCountValue = () => {
// 更新用の変数を設定
const setValue = useSetRecoilState(atomState)
// atomStateの値を更新
return <button onClick={() => setValue((v) => v + 1)}>+1</button>
}
useRecoilState
useRecoilState
は値の取得も更新もできます。
なので、useRecoilValue
とuseSetRecoilValue
を使う場面は限られてくるかもしれませんね。
ただ、値の取得をする場合には値が変化すると再レンダリングが発生してしまいパフォーマンス的にもよろしくない場合があるので、更新の必要はなく取得のみをしたい場合はuseRecoilValue
を使うとよいでしょう。
import { useRecoilState } from 'recoil'
export const CountValue = () => {
// useStateみたいに第一引数に現在のstate、第二引数に更新用の関数を設定します
const [value, setValue] = useRecoilState(atomState)
return (
<>
<span>{value}</span>
<button onClick={() => setValue((v) => v + 1)}>+1</button>
</>
)
}
参考
- https://github.com/facebookexperimental/Recoil
- https://recoiljs.org/docs/introduction/getting-started/
- https://zenn.dev/kyo9bo/articles/58b0ef35837462
- https://zenn.dev/susiyaki/articles/95dea88e673e1f854130
- https://qiita.com/itachi/items/02688096bc5734396e8e
- https://qiita.com/itachi/items/69784d66dbe624ebaceb
- https://sbfl.net/blog/2020/05/17/react-experimental-recoil-usage/
- https://yoheiko.com/blog/recoil%E3%81%AE%E4%BB%95%E7%B5%84%E3%81%BF%E3%81%A8%E4%BD%BF%E3%81%84%E6%96%B9/
さいごに
recoil
を使う機会があったのをきっかけでまとめてみたのですが、これまでに触れたことがなくてもわりと感覚的にシンプルに使うことができたので、これからまた別のプロジェクトでも使ってみたいなと思いました。
また、今回は超基本的な内容のみのとなりましたが、これからまた使っていく中でつまったところや便利なところなどを記事にしていきます。