Featured image of post NextJS で LocalStorage を使う方法

NextJS で LocalStorage を使う方法

NextJSでローカルストレージを使用して、値の読み込み・書き込みをする方法

NextJS で LocalStorage を使用する際、読み込みで苦戦したので書き留めておきます。

# 結論

実装例は以下のとおりです。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import React, { useEffect, useState } from "react";

const GetValueFromLocalStorage: React.FC = () => {
  const [Value, setValue] = useState<string>("");
  const [newValue, setNewValue] = useState<string>("");
  useEffect(() => {
    const _Value = localStorage.getItem("Value");
    if (_Value) {
      setValue(_Value);
    }
  }, [Value]);
  return (
    <>
      <p>Local Storage Value:{Value}</p>
      <p>New Value:{newValue}</p>
      <input
        type="text"
        onChange={(e) => {
          localStorage.setItem("Value", e.target.value);
          setNewValue(e.target.value);
        }}
      />
    </>
  );
};
export default GetValueFromLocalStorage;

この例ではフォームに値入力して、その値をローカルストレージに保存します。 image1 次の再読込のときに保存された値を読み取り、表示します。 image2

# はじめに

EC サイトを作っていく中で、ログイン状態を保持したり、カートのデータをどこかに格納したりなどをしたくなった場面が多かったのですが、始めた当時、あまり知識がなく、エラーを解決できず、別な方法で実装していました。

cookie にカート ID を保存し、サーバでカートのデータを管理する方法や、コンテキストを使用して、サーバから持ってきたデータを保持するなど hugo 色々な方法、recoil を使って情報を保持する方法などをやってきましたが、やっぱりローカルストレージで管理し、購入時などにそのカート情報が適切かどうか判定する実装のほうが、リアルタイム性があり、簡単なのではないかと考え改めて実装し直しました。

# スタックした問題と解決法

# LocalStorage から値を読み出せない scp

NextJS ではサーバーサイドレンダリングとクライアントサイドレンダリングが存在し、基本的にサーバーサイドレンダリングが行われます。

しかし、サーバーサイドレンダリング中に LocalStorage を使用すると LocalStorage が存在しないため、エラーを吐いてしまいます。 image3 この問題を解決するために、useEffect を使用することにしました。

useEffect で囲むことによってクライアントサイドで処理され、LocalStorage を読み取ることができます。

# 読み込んだ値を扱えない

せっかく LocalStorage から値を読み込めたとしても、その値を使えないと意味がないですよね。

ですので読み込んだ値を useState で管理することで、値をクライアントサイドレンダリング後に変更できるようにしました。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
import React, { useEffect, useState } from "react";

const GetValueFromLocalStorage: React.FC = () => {
  const [Value, setValue] = useState<string>("");
  useEffect(() => {
    const _Value = localStorage.getItem("Value");
    if (_Value) {
      setValue(_Value);
    }
  }, [Value]);
  return (
    <>
      <p>Local Storage Value:{Value}</p>
    </>
  );
};
export default GetValueFromLocalStorage;

# 感想

使えるようになった今だからこそ、スタックした問題はそれはそうだよなと思います

しかし実際にスタックしているときどうすればいいか、かなり手探りだったななと思いました。

# 参考

comments powered by Disqus
Hugo で構築されています。
テーマ StackJimmy によって設計されています。