不可变更新功能不起作用

时间:2015-12-15 09:47:32

标签: javascript immutable.js

我正在使用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没有变化。

先谢谢。

1 个答案:

答案 0 :(得分:0)

您已宣布initialState const,这意味着您无法更改该变量所持有的值(它是一个变量,尽管事实上它不可能改变)。所以

initialState = initialState.updateIn(/*...*/);

不会更新initialState中的值。

如果您需要,请将const更改为varlet

关于productList:请注意Array#map 返回新数组,它不会修改现有数组。所以你可能想要:

productList = productList.map(/*...*/);

您可能知道这一点,但无论如何我都会将其标记出来:const是ES2015(ES6)中JavaScript的新功能。它受到V8(Chrome和NodeJS)等最新引擎的支持,但是大量的浏览器还没有它(或者是因为它们还没有,或者因为人们使用的是在规范最终确定之前发布的旧版本。)如果您没有意味着使用ES2015功能,那么您需要var而不是比let(因为let也是新的)。