【发布时间】:2017-05-25 16:38:45
【问题描述】:
我正在处理一个购物车,我正试图解决我的应用程序的两个问题:
将商品添加到商店会覆盖商店中以前的商品:
初始状态:
const initialState = {
items: {},
showCart: false
};
添加到购物车减速器:
问题:这适用于将商品添加到购物车,但是当我在购物车中添加另一个商品时,它会覆盖前一个商品。为什么会这样/如何将项目保留在以前的状态?
let addToCartState = {...state,
items: {
[action.id]: {
id: action.id,
color: action.product_selection.color,
size: action.product_selection.size,
quantity: 1
}
},
showCart: true
}
return state.merge(addToCartState);
从购物车减速器中删除所有内容:
问题:这似乎可行,但我似乎无法从状态图中获取数据。我似乎无法像在其他州一样调用“state.cart.items”(参见 mapStateToProps)。
let removeFromCartState = {...state,
items: {
...state.items
},
showCart: true
}
function mapStateToProps(state) {
console.log(state.cart);
console.log("????");
return { products: state.products, items: state.cart.items }
}
state.cart:
Map {size: 8, _root: ArrayMapNode, __ownerID: undefined, __hash: undefined, __altered: false}
size: 8
__altered: false
__hash: undefined
__ownerID: undefined
_root: ArrayMapNode
entries: Array(8)
0: Array(2)
0: "items"
1: Map
size: 0
...
^ 现在没有项目(大小:0,在上一个减速器之后是 1);我现在需要使用 fromJS 之类的东西来解析它还是不必这样做?
编辑 - combineReducers:
import {combineReducers} from 'redux';
import app from './appReducer';
import products from './productsReducer';
import cart from './cartReducer';
import user from './userReducer';
export default combineReducers({
app: app,
products: products,
cart: cart,
user: user
});
【问题讨论】:
-
您是否设置了
combineReducers,它的结构如何?对于“添加到购物车减速器”,您还必须复制嵌套对象。所以{...state, items: { ...state.items, /* etc.*/ } } -
我刚刚尝试复制嵌套对象,但奇怪的是我仍然得到同样的结果,一次只能将一种产品放入购物车。我确实有一个 combineReducers,就像:
export default combineReducers({ app: app, products: products, cart: cart, user: user }); -
如果您使用扩展运算符(
...state和...state.items),则不必将新状态与旧状态合并。这本质上是复制所有内容,并且当您将值更新为覆盖以前的对象中的键时。此外,更新您的代码以包含combineReducers(如果有)。这应该可以帮助我为您提供更好的答案。此外,如果代码位于单独的文件中,请将它们分开。一大段代码让它看起来像是在同一个文件中。 -
@KeithAlpichi 添加了我的 combineReducers,不确定这是否有帮助。这就是我对扩展运算符的想法,但无论出于何种原因,它实际上并没有保留先前状态的数据。
标签: javascript ecmascript-6 redux immutable.js