【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です。