【Next.js】sessionStorageの実装方法

目次

はじめに

この記事ではNext.jsにおけるsessionStorageの実装方法について解説します。

Next.jsにおけるlocalStorageの実装方法は以下の記事で解説しています。

localStoragesessionStorageの違いは以下の記事で解説しています。

sessionStorageの実装方法

Next.jsにおいてsessionStorageの実装方法を以下に示します。

useCounterというカスタムHooksを実装します。

このカスタムHooksでstorage_key_counterというキーに対して、setItemgetItemを用いてsessionStorageとやりとりをしています。

"use client"
import useCounter from '../hooks/useCounter';

function HomePage() {
  const [count, setCount] = useCounter(0);
  const increment = () => setCount(count + 1);
  const decrement = () => setCount(count - 1);
  const clear = () => setCount(0);

  return (
    <div>
      <h1>sessionStorageのサンプル</h1>
      <p>{`カウント:${count}`}</p>
      <button onClick={increment}>+1</button>
      <button onClick={decrement}>-1</button>
      <button onClick={clear}>clear</button>
    </div>
  )
}

export default HomePage;

useCounterの呼び出し側です。

useCounterに初期値を指定するだけです。

後は、setCountをラップしたincrementdecrementclear関数を定義してカウントを更新しています。

"use client"
import useCounter from '../hooks/useCounter';

function HomePage() {
  const [count, setCount] = useCounter(0);
  const increment = () => setCount(count + 1);
  const decrement = () => setCount(count - 1);
  const clear = () => setCount(0);

  return (
    <div>
      <h1>sessionStorageのサンプル</h1>
      <p>{`カウント:${count}`}</p>
      <button onClick={increment}>+1</button>
      <button onClick={decrement}>-1</button>
      <button onClick={clear}>clear</button>
    </div>
  )
}

export default HomePage;

動作確認結果は以下です。

0から2になっている箇所がありますが、ストレージにカウントが保存されているため、更新すると初期値の0から保存値である2にレンダリングしています。

localStorageは異なり、一度ブラウザを閉じるとセッションストレージはクリアされます。

再度別タブで開くと、初期値である0が表示されます。

よってsessionStorageは一時的(タブが閉じられるまで)にデータを保存することになります。

しかし、localStorageと同様に1つ問題があります。

それはsessionStorageから値を読み込むまでは初期値の0が表示されてしまいます。

上記を回避するために、useStateを使用してマウントされたかの状態を管理します。

一例ですが、マウントされるまではLoading…を表示するようにしています。

"use client"
import { useEffect, useState } from 'react';
import useCounter from '../hooks/useCounter';

function HomePage() {
  const [mounted, setMounted] = useState(false)

  useEffect(() => {
    setMounted(true);
  }, [])

  const [count, setCount] = useCounter(0);
  const increment = () => setCount(count + 1);
  const decrement = () => setCount(count - 1);
  const clear = () => setCount(0);

  if (!mounted) return <div>Loading...</div>

  return (
    <div>
      <h1>sessionStorageのサンプル</h1>
      <p>{`カウント:${count}`}</p>
      <button onClick={increment}>+1</button>
      <button onClick={decrement}>-1</button>
      <button onClick={clear}>clear</button>
    </div>
  )
}

export default HomePage;

動作確認は以下です。

マウントされるまではLoading…が表示されています。

関連記事

おわりに

本記事では、Next.jsにおけるsessionStorageの実装方法について説明しました。

是非、いいねやコメントをお願いします。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次