我正在使用immutable.js函数update()和updateIn()。但结果却没有达到预期的效果。
const initialState = Immutable.fromJS({cartList: [
{
id: 1,
name: "Product One",
quantity:1
},{
id: 2,
name: "Product Two",
quantity:2
}],
productList:[{
name: "Product One",
id: 1,
availability:2
},{
name: "Product Two",
id: 2,
availability:2
},{
name: "Product Three",
id: 3,
availability:4
}]});
var action = {
id: 2,
name: "Product Two",
quantity:2
};
initialState = initialState.updateIn(['cartList'], cartList => cartList.push(action)).toJS();
initialState = initialState.updateIn(['productList'], productList => {
productList.map(product => {
if(action.id == product.get("id")){
return product.update("availability", value => value-1);
} else
return product
});
}).toJS();
console.log(initialState.toJS());
我在jsfiddle中尝试过。但是initialState没有变化。
先谢谢。
答案 0 :(得分:0)
您已宣布initialState
const
,这意味着您无法更改该变量所持有的值(它是一个变量,尽管事实上它不可能改变)。所以
initialState = initialState.updateIn(/*...*/);
不会更新initialState
中的值。
如果您需要,请将const
更改为var
或let
。
关于productList
:请注意Array#map
返回新数组,它不会修改现有数组。所以你可能想要:
productList = productList.map(/*...*/);
您可能知道这一点,但无论如何我都会将其标记出来:const
是ES2015(ES6)中JavaScript的新功能。它受到V8(Chrome和NodeJS)等最新引擎的支持,但是大量的浏览器还没有它(或者是因为它们还没有,或者因为人们使用的是在规范最终确定之前发布的旧版本。)如果您没有意味着使用ES2015功能,那么您需要var
而不是比let
(因为let
也是新的)。