【发布时间】:2021-11-16 06:10:56
【问题描述】:
我正在尝试使用 redux 实现购物车。这是我的购物车减速器:
export const cartReducer = (
state = { cartItems: JSON.parse(localStorage.getItem("cartItems") || "[]")},
action) => {
switch (action.type) {
case ADD_TO_CART:
return { ...state,cartItems: action.payload };
}}
这是我想要显示更新的状态值的组件,使用连接中的道具访问它并在每次状态更新后更新 cartItems.length
class Cartsidebar extends Component {
constructor(props) {
super(props);
this.state = {
grandTotal: '',toggle:true
}
}
handleHide(){
this.setState({ toggle: !this.state.toggle})
}
render() {
const {cartItems}=this.props;
console.log(cartItems);
return (
<div>
{cartItems.length}
</div>
)
}
}
export default connect(
(state) => ({
cartItems: state.cart.cartItems,
}),
{ incrementToCart, decreaseToCart, removeFromCart }
)(Cartsidebar);
状态更新正常,每次 redux 状态更新时,redux-dev-tools 中也会显示状态差异,但它没有反映在购物车组件中。我在这里做错了什么?提前致谢。
编辑: 这是在添加到购物车按钮 onclick 事件时执行的函数:
handleAddToCart=(p)=>{
const cartItems = store.getState().cart.cartItems;
let alreadyExists = false;
cartItems.forEach((x) => {
if (x.discountPer === p.discountPer) {
alreadyExists = true;
}
});
if (!alreadyExists) {
cartItems.push({ ...p });
}
store.dispatch(addToCart(cartItems));
}
addToCart 动作创建器看起来像这样:
export const addToCart = (cartItem) => {
return({
type: ADD_TO_CART,
payload: cartItem,
});
};
【问题讨论】:
-
调用添加到购物车时您的代码是什么样的?
-
@apachuilo 我已经进行了编辑以包括操作和 addToCart 处理程序。
-
我可能弄错了,但您添加到购物车的方式是可变的。我认为除非它是一个新数组,否则 redux 不会认识到这一点。为了测试起见,您可以查看将调度更改为
store.dispatch(addToCart([...cartItems]));是否有帮助。 -
链接到讨论一些不可变更新模式的文档redux.js.org/usage/structuring-reducers/…
-
尝试了您建议的修复方法。但仍然无法正常工作
标签: reactjs redux react-redux react-props redux-reducers