【发布时间】:2021-10-12 21:05:34
【问题描述】:
我想将更新后的状态保存到 localStorage,但尝试此操作时遇到错误。 localstorage is not defined
cartSlice.jsx
import {v4 as uuid} from "uuid";
import {createSlice} from "@reduxjs/toolkit";
const data = JSON.parse(localStorage.getItem('cart'));
export const cartSlice = createSlice({
name: 'shoppingCart',
initialState: data ? data : [],
reducers: {
addToCart: (state, action) => {
const product = action.payload;
const productInCart = state.find(item => item.id === product.id && item.color === product.color && item.size === product.size && item.material === product.material);
if (productInCart) {
const cartProductIndex = state.findIndex(item => item.id === product.id);
state[cartProductIndex].quantity = state[cartProductIndex].quantity + product.quantity;
} else {
product['cartId'] = uuid();
return [product, ...state];
}
localStorage.setItem('cart', JSON.stringify(state));
}
}
})
cartAction.js
import {addToCart} from "@slices/cartSlice";
export const addToCartAction = (payload) => (dispatch) => {
dispatch(addToCart(payload))
}
如何解决?
【问题讨论】:
-
而 什么 是错误?试图从这里
JSON.parse(localStorage.getItem('cart'));解析本地存储中的空/未定义购物车状态? -
@DrewReese 错误是
localstorage is not defined -
哦,我看到你在标题中提到了 Nextjs,是的,我认为 localStorage 在 SSR 中不可用。我不确定这里的最佳解决方案,但我怀疑它会涉及当组件安装在某处时在客户端初始化某些状态。
-
我假设您要么必须禁用服务器端呈现,要么确保代码仅在客户端执行。
-
addToCartAction应该没问题,只有在按下按钮时才会执行(我假设)。问题是createSlice在导入、服务器和客户端上执行。
标签: reactjs redux local-storage redux-toolkit