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カスタムフックを使えば型安全かつ簡潔に管理できる