我正在尝试创建一个购物车。我创建了一个上下文,并在按购物车上的增量和减量按钮时将状态作为值传递,我的商品计数正在更改,但当我在导航栏组件中使用相同的上下文时,购物车中的商品总数不会更改。我附上下面的代码片段
这是我创建上下文的地方
const initialState:initialType = { cartItems:cartItems, totalItems:cartItems.reduce((accumulator, object) => { return accumulator + object.quantity }, 0), totalAmount:0 } export const CartContext = createContext<initialType|null>(initialState);
下面是我的 useContext 提供程序。
<CartContext.Provider value={{...state}}>
<ContextCart removeItems={removeItems} increment={increment} decrement={decrement}/> </CartContext.Provider>
状态的值来自 useReducer,它正在更新一切正常
这就是我如何使用导航栏中的 useContext Hook 来获取购物车中的商品总数
const cartItems = useContext(CartContext); return ( <div>{cartItems.totalItems}</div>` )
但每当状态发生变化时,导航栏都不会重新呈现更新后的购物车中的商品总数,请帮助我。
这是我的 useReducer 函数及其更新的一切。我已经通过执行 console.log() 检查了它的功能。它返回的一切都很好,其中还包括 state.totalItems。
type actionType={ type:string, payload:string } export const reducer = (state:initialType ,action:actionType) => { if(action.type === "Delete" ){ return { ...state, cartItems:state.cartItems.filter((currentElement)=>{ return currentElement.id != action.payload }) } } if (action.type === 'increment'){ state.cartItems.forEach((element)=>{ if (element.id === action.payload){ element.quantity++; state.totalItems++ } }) return {...state}; } if (action.type === 'decrement'){ state.cartItems.forEach((element)=>{ if (element.id === action.payload){ element.quantity--; state.totalItems--; } }) console.log(state) return {...state}; } return {...state}; }```
当您使用
useReducer
时,它会返回当前状态,对吧?就你而言,该状态是一个对象。因此,您可以直接从该状态对象获取totalItems
。例如:因此,这样,
totalItems
就会从状态对象中直接拉出,您可以在任何需要的地方使用它。