Reactで作ったアプリ、ページをリロードすると全部初期化されてしまう。
これでは「Todoアプリで入力したタスクが消える」「ログイン状態が保持できない」など困る場面も多い。
そんなときに使えるのがlocalStorage。
tsx
// 保存
localStorage.setItem("key", JSON.stringify(data));
// 取得
const saved = JSON.parse(localStorage.getItem("key") || "null");
// 削除
localStorage.removeItem("key");
でもこれ、毎回JSON.stringify
やparse
を書くのが面倒だし、Reactの状態とも同期しづらい。
なので、useState + localStorageを連携させるカスタムフックを使うのが実用的。
tsx
const [value, setValue] = useLocalStorage<T>("key", initialValue);
この1行で、Reactの状態とlocalStorageの双方向バインディングが実現する。
setValue
で状態とlocalStorageを同時更新JSON.stringify/parse
してくれるwindow
存在チェック)も入ってるtsx
const [name, setName] = useLocalStorage<string>("userName", "");
tsx
const [todos, setTodos] = useLocalStorage<Todo[]>("todos", []);
tsx
const [settings, setSettings] = useLocalStorage<Settings>("settings", {
theme: "light",
language: "ja",
});
状態管理だけ | localStorage連携あり |
---|---|
リロードで消える | リロードしても保持される |
毎回初期化が必要 | 以前の状態から再開できる |
一時的な値管理 | 長期的なデータ保存も可能 |
useEffect
で初期化するのではなく、最初からuseLocalStorage
で扱うのがラクsetValue(null)
ではなく**removeItem()
的な処理をhook内で用意しておくと便利**👇 サンプル:React × localStorage連携Todoアプリ
useLocalStorage
カスタムフックを使えば型安全かつ簡潔に管理できる