【React】でセッションストレージやローカルストレージのデータを取得する方法

React

Reactでセッションストレージやローカルストレージのデータを取得する方法を紹介します。
セッションストレージでもローカルストレージでもやり方はまったく同じため、以下の例では、セッションストレージで紹介します。
localStorageの扱いが不安な場合は、【JavaScritpt】ブラウザ保存領域にデータを格納するlocalStorageの使い方を参考にしてみてください。

Reactでセッションストレージのデータを取得する方法

<div class="contents__container l-contents" id="mainContent"></div>

まずはマウントするためのhtmlを準備します。

App.jsなどルートのjsでそのままセッションストレージのデータを取得する場合

import React, { useEffect, useState } from 'react';
import { createRoot } from 'react-dom/client';
import Catalog from './catalog/Catalog';
import Sidebar from './catalog/Sidebar';
import OpenDownloadModal from './catalog/OpenDownloadModal';

function App() {
  const [cartItems, setCartItems] = useState([]); // カートアイテムの状態
  const [open, setOpen] = useState(false); // モーダルボタンの状態
  const [show, setShow] = useState(false); // サイドバーの表示状態

  // セッションストレージから保存されたカタログIDを取得し、重複を取り除く
  const storedCatalogIdsJSON = sessionStorage.getItem('catalogIds');
  const storedCatalogIds = storedCatalogIdsJSON
    ? JSON.parse(storedCatalogIdsJSON).map(id => parseInt(id))
    : [];
  const uniqueCatalogIds = [...new Set(storedCatalogIds)];

  // 初回レンダリング時にセッションストレージからカートアイテムを取得して初期化
  useEffect(() => {
    setCartItems(uniqueCatalogIds);
  }, []);

  // カートアイテムが変更されたときの処理
  useEffect(() => {
    if (cartItems.length === 0) {
      setOpen(false); // カートが空ならモーダルを閉じる
      setShow(false); // サイドバーを非表示にする
    } else {
      setOpen(true); // カートにアイテムがあればモーダルボタンを開く
    }
  }, [cartItems]);

  // カートにアイテムを追加する関数
  const handleAddToCart = catalogId => {
    setCartItems(prevCartItems => [...prevCartItems, catalogId]);
    setOpen(true); // モーダルボタンを開く
    setShow(true); // サイドバーを表示する
  };

  // カートからアイテムを削除する関数
  const handleRemoveFromCart = catalogId => {
    setCartItems(prevCartItems =>
      prevCartItems.filter(item => {
        return parseInt(item, 10) !== parseInt(catalogId, 10);
      })
    );
  };

  return (
    <>
      {/* Catalog コンポーネントに cartItems を渡す */}
      <Catalog cartItems={cartItems} onAddToCart={handleAddToCart} />
      {/* Sidebar コンポーネントに cartItems を渡す */}
      <Sidebar
        cartItems={cartItems}
        onRemoveFromCart={handleRemoveFromCart}
        show={show}
        toggleMenu={() => {
          setShow(!show);
        }}
      />
      {cartItems.length !== 0 && (
        <OpenDownloadModal
          cartItems={cartItems}
          open={open}
          toggleMenu={() => {
            setShow(!show);
          }}
        />
      )}
    </>
  );
}

const domNode = document.getElementById('mainContent');
const root = createRoot(domNode);
root.render(<App />);

まずセッションストレージに保存されているデータを取得するために、それを状態管理するためにuseStateを使います。
上の例ではcartItemsです。
そして、useEffectで第二引数を空にすることで、初回のレンダリング時にセッションストレージからカートアイテムを取得して初期化します。
これで、sessionStorageからデータを取得することができます。
あとは、cartItemsが更新されるたびに発火させたければ、上のようにuseEffectを別に作成して第二引数にcartItemsをいれます。

new Setで重複データを削除していますが、より詳しく知りたい場合は、JavaScriptの重複を消すことができるSetの使い方と具体例を参考にしてみてください。
あとは、自由に使いたいようにすればOKです。

React

Posted by devsakaso