I am Creating an E-commerce website using React, and I am setting the cart items (which the user has selected to add to his/her cart) in the localStorage
on page load and then getting them using localStorage.getItems()
.
But for some reason when I am trying set Items to localStorage
using the useEffect
hook then it’s not running I don’t know why. I even tried to console.log()
, but that is also not running.
And because of that when the function which gets the item from localStorage
runs it returns null
.
Here is the code please help me out.
import { createContext, useContext, useReducer, useEffect } from "react";
import { reducer } from "../reducer/CartReducer";
// creating Context using context API
const CartContext = createContext();
const getLocalCartData = () => { // this function returns null because useEffect did not run and not set any thing to the localstorage.
let localCartData = localStorage.getItem('CartItems');
console.log(localCartData)
if (localCartData === []) {
return [];
} else {
return JSON.parse(localCartData);
}
}
// Defining initial State for the useReducer
const initialState = {
cart: getLocalCartData(),
total_item: ""
}
const CartProvider = ({ children }) => {
// Defining useReducer, dispatch, state
const [state, dispatch] = useReducer(reducer, initialState);
// Add products to cart
const addToCart = (MainProduct, amount) => {
dispatch({ type: "ADD_TO_CART", payload: { MainProduct, amount } });
};
// Add products to cart
const removeItem = (id) => {
dispatch({ type: "REMOVE_ITEM", payload: id });
};
// Decreament Product Quantity
const setDecreament = (id) => {
dispatch({ type: "SET_DECREAMENT", payload: id })
}
// Increament Product Quantity
const setIncreament = (id) => {
dispatch({ type: "SET_INCREAMENT", payload: id })
}
useEffect(() => { // this one useEffect is not running
console.log("It Should run here")
localStorage.setItem('CartItems', JSON.stringify(state.cart));
}, [])
// Creating the Provider
return (<CartContext.Provider value={{ ...state, addToCart, removeItem, setIncreament, setDecreament }}>
{children}
</CartContext.Provider>);
}
// Creating use context API
const useCartContext = () => {
return useContext(CartContext);
}
export { CartProvider, useCartContext };
>Solution :
First of all, this if (localCartData === [])
will never be true. I think you wanted to check if there is nothing in the storage, if so, it should be if (!localCartData)
.
Then, your useEffect
, because it has an empty dependency array, will run only once, on the mount. You would wanna add state
as a dependency:
useEffect(() => {
console.log("It Should run here")
localStorage.setItem('CartItems', JSON.stringify(state.cart));
}, [state])