【发布时间】:2026-01-31 12:05:02
【问题描述】:
我有一个带有添加、更新和删除案例的购物车减速器功能。我在 redux 商店中也有一个产品数组。 当产品数组中添加了两个项目时,我增加了数量值,而不是两个项目。我的主要问题是,reducers 是否应该包含任何逻辑,即确定 products 数组是否已经包含确切的产品并且只返回产品数量的更新,或者是否应该在检查现有产品的演示组件中处理此行为并添加新的产品或更新数量?
function CartReducer (state = initialState, action) {
switch (action.type) {
case AddToCart:
return {
...state,
products: [...state.products, action.product],
totalPrice: state.totalPrice += (action.price * action.quantity)
}
case RemoveItemCart:
return {
...state,
products: [
...state.products.slice(0, action.index),
...state.products.slice(action.index + 1)
]
}
case UpdateItemQuantity:
return {
...state,
products: state.products.map((product, index) => {
if (index === action.index) {
return Object.assign({}, product, {
quantity: action.quantity
})
}
return product
})
}
default:
return state
}
}
【问题讨论】:
-
reducer 可以有任何你想要的逻辑,只要它们保持纯净。 pure 意味着没有副作用,例如异步调用或更改或依赖其上下文之外的对象,也没有改变它们的
state。 -
React+redux 是前端,CQRS+Event sourcing 是后端。调度动作本质上是将消息放在事件队列中。在它们上应用减速器基本上是处理存储。所以,在我看来,进入 reducer 的逻辑应该只与状态的存储方式有关,包括。优化、一致性和其他东西。
-
参见youtube/fU9hR3kiOK0?t=21m6s 以供参考 - 您可以将事件流想象为动作。当他谈到物化视图时,redux store 将是主要的。然后,Reducer 将是一个函数,它可以根据操作递增地转换存储。 Reducer 需要是不可变的——所有副作用都需要通过操作来处理。至于其他物化视图,它们可以被认为是选择器应用于状态的中间状态。本质上,组合reducer和selector仍然是一个转换函数。
标签: reactjs react-native redux react-redux