2016-11-22 2 views
0

Использование Redux в Angular2 (NgRedux) для обновления/настройки записи заказа. Является ли это правильным для изменения прокси-переменной, а затем object.assign его в состояние?Redux: Это считается мутирующим состоянием?

В моем редукторе данных:

case DataActions.UPDATE_ORDER: 
    var updatedItem 
    var updatedState = state.orders 
    for(var i = 0; i < state.orders.length; ++i) { 
    if(state.orders[i]['key'] === action.payload.key) { 
     updatedItem = state.orders[i] 
     updatedItem.name = action.payload.name 
     updatedItem.items = action.payload.items 
    } 
    } 
    updatedState[i] = updatedItem 
    return Object.assign({}, state, { 
    orders: updatedState 
    }) 
+0

Я использую (мой пакет) [flatcopy] (https://www.npmjs.com/package/flatcopy) для всех моих восстановителей, а также копировать мои объекты/массивы, прежде чем мутирует их. Чтобы увидеть, что это копия, я префикс vars с '_', поэтому у любого задания должен быть символ подчеркивания слева (см. Также readme of flatcopy). – Aitch

ответ

3

Ваш «прокси-переменная» только одна ссылка на тот же объект, так что да, вы являются непосредственно мутирует элементов в этом массиве.

Для правильного внесения неизменных обновлений каждый уровень вложенности должен быть скопирован. В документах Redux приводятся примеры как распространенных ошибок, так и того, как это сделать правильно, в http://redux.js.org/docs/recipes/reducers/ImmutableUpdatePatterns.html.

+0

Да! Спасибо, добрый сэр. Я знал, что что-то от него отвлекло. –

0

Большое спасибо @markerikson за решение.

Я пошел с советами по документации и использовал библиотеку dotProp. Это сработало:

npm install dot-prop-immutable 
... 
var dotProp = require('dot-prop-immutable'); 
... 
case DataActions.UPDATE_ORDER: 
    for(var i = 0; i < state.orders.length; ++i) { 
    if(state.orders[i]['key'] === action.payload.key) { 
     state = dotProp.set(state, `orders.${i}.name`, action.payload.name) 
     state = dotProp.set(state, `orders.${i}.items`, action.payload.items) 
    } 
    } 
    return state 
Смежные вопросы