2016-06-08 3 views
1

У меня есть эта безумная проблема, которая, как мне кажется, больше связана с чистым JS, а не с сокращением.Редуктор редукции не меняет

Мое начальное состояние выглядит следующим образом:

и это часть моего редуктора так, когда я пытаюсь изменить значение массива выходов (например, третье значение)

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"]

поэтому состояние не изменилось ...

Когда я пытаюсь изменить analogIn он работает

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

Любые идеи, почему это происходит? Это связано с сокращением?

+0

Проблема заключается в вашем более широком применении, редуктор выше, поскольку чистая функция работает нормально. http://jsbin.com/wuqidefujo/edit?js,console,output – Lee

ответ

0

Хорошо, нашел решение.

Как кажется, с помощью этого:

newstate.outputs = outputs 

или это:

newstate.outputs[num] = "1" 

не работает, если вы хотите скопировать содержимое одного массива к значению объекта, который является массивом

решение было клонировать массив

newstate.outputs = outputs.slice(0) 

Я не уверен, что это произошло из-за es6 или это чистый JS.

Смежные вопросы