🦁

ZustandとValtioの比較 (React状態管理ライブラリの話)

2021/05/20に公開

https://twitter.com/dai_shi/status/1391693358305734666

https://twitter.com/dai_shi/status/1394576149133467651

最近書いた2つのツイートのポイントをまとめておきます。

storeの作り方

Zustandの場合

import create from 'zustand'

const useStore = create((set) => ({
  count1: 0,
  count2: 0,
  inc1: () => set((state) => ({ count1: state.count1 + 1 })),
  inc2: () => set((state) => ({ count2: state.count2 + 1 })),
}))
  • create は hookを返す
  • set で更新する

Valtioの場合

import { proxy, useSnapshot } from 'valtio'

const state = proxy({
  count1: 0,
  count2: 0,
  inc1: () => { ++state.count1 },
  inc2: () => { ++state.count2 },
})
  • proxy は JavaScriptのproxy化されたobjectを返す
  • state を直接更新する

Reactコンポーネントでの使い方

Zustandの場合

  const count1 = useStore((state) => state.count1)
  const inc1 = useStore((state) => state.inc1)
  • 作った useStore を使う
  • selectorを使って、値とアクション関数をそれぞれ取り出す

Valtioの場合

  const { count1, inc1 } = useSnapshot(state)
  • useSnapshot を使って、作った state を渡す
  • object destructuringで値とアクション関数を取り出す(再レンダリングは自動で最適化される)

GitHubリンク

https://github.com/pmndrs/zustand

https://github.com/pmndrs/valtio

Discussion