Я хочу сохранить свое обновленное состояние в 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))
}
Как это решить?
И в чем ошибка? Пытаетесь проанализировать нулевое/неопределенное состояние корзины из localStorage здесь
JSON.parse(localStorage.getItem('cart'));
?Ошибка @DrewReese:
localstorage is not defined
О, я вижу, вы упоминаете Nextjs в заголовке, да, я не думаю, что localStorage доступен в SSR. Я не уверен в лучшем решении здесь, но я подозреваю, что оно будет включать инициализацию некоторого состояния на стороне клиента, когда компонент где-то монтируется.
Я предполагаю, что вам нужно либо отключить рендеринг на стороне сервера, либо убедиться, что код выполняется только на клиенте.
addToCartAction
должно быть в порядке, это выполняется только при нажатии кнопки (я полагаю). Проблема заключается вcreateSlice
, который выполняется при импорте, на сервере и на клиенте.@Elias, с Context API мы использовали хук useEffect, но я не нашел ни одного примера с набором инструментов Redux. prnt.sc/1lkzb0x
@RajuAhammad да, эффект использования выполняется только на клиенте, так что проблема в этом.