How to use useContext correctly in React
File Path
- Create a folder named
contexts in the src folder.
.
src
App.tsx
api
components
*contexts
CartContext.tsx
Create a context
- Create a new file named
CartContext.tsx in the contexts folder.
import { createContext, useContext, useState, useEffect } from 'react';
interface CartItem {
id: number;
name: string;
quantity: number;
}
interface CartContextType {
cart: CartItem[]
addCartItem: (item: CartItem) => void
}
const CartContext = createContext<CartContextType|null>(null)
export const useCart = () => {
const cartContext = useContext(CartContext)
if (cartContext === null) {
throw new Error("useCart must be used under provider")
}
return cartContext
}
interface CartProviderProps {
children: React.ReactNode
}
export const CartProvider: React.FC<CartProviderProps> = ({ children }) => {
const [cart, setCart] = useState<CartItem[]>(() => {
const prevCart = localStorage.getItem('cart')
return prevCart? JSON.parse(prevCart): []
})
useEffect(() => {
localStorage.setItem('cart', JSON.stringify(cart))
}, [cart])
const addCartItem = (item: CartItem) => {
setCart(prevItem => [...prevItem, item])
}
return (
<CartContext.Provider value={{
cart,
addCartItem
}}>
{children}
<CartContext.Provider>
)
}