反应还原剂不会变质

时间:2016-06-08 07:14:44

标签: javascript arrays reactjs redux

我遇到了这个疯狂的问题,我认为有关纯JS而不是redux的更多信息。

我的初始状态如下:

let data = {
    outputs : ["0", "0", "0", "0"],
    analogIn : "0"
}

这是我的reducer的一部分所以当我尝试更改输出数组的值(例如第3个值)时

let newstate = Object.assign({}, state);
    switch (action.type) {
        case 'CLICK_OUTPUT':
            let outputs = newstate.outputs
            let status = outputs[action.num]
            let newStatus = (status == "0") ? "1" : "0"
            outputs[action.num] = newStatus
            newstate.outputs = outputs
            console.log(newstate.outputs[action.num])    <-- 1.
            console.log(newstate.outputs)                <-- 2. 
            console.log(newstate)                        <-- 3.
            return newstate
        default:
            return state || data.data
}
  1. 返回“1”,这是正确的
  2. 返回[“0”,“0”,“1”,“0”]这是正确的
  3. 返回

    analogIn:“0”,   输出:[“0”,“0”,“0”,“0”]

  4. 所以状态没有改变......

    当我尝试更改模拟时,它可以正常工作

    case 'CHANGE_IN':
        newstate.analogIn = action.val
        return newstate
    

    为什么会发生这种情况? 它与redux有关吗?

1 个答案:

答案 0 :(得分:0)

好的,找到了解决方案。

似乎正在使用它:

newstate.outputs = outputs

或者这个:

newstate.outputs[num] = "1"
如果要将一个数组的内容复制到一个数组对象的值

不起作用

解决方案是克隆数组

newstate.outputs = outputs.slice(0)

我不确定这是因为es6还是纯粹的JS。