2017-02-20 2 views
1

редукторасостояние изменилось, но рендер не вызывается снова

` 
saveEnd(state, action){ 
    let data = action.payload; 
    let data1 = {}; 
    data1['' + data.platform] = {}; 
    data1['' + data.platform]['' + data.type] = data; 
    $.extend(true, state.serCfgData, data1); 
    return state 
} 
` 

Я считаю, состояние изменился в хромированном Redux разработки инструментов, но вид не обновлять, а затем, когда я использую return {...state} в просмотр - это обновление, я не понимаю.

ответ

1

Когда вы видите обновление хранилища редукта, но не видите компонент Render, одна из первых вещей, которую вы должны сделать, это проверить, не мутирован ли ваш объект состояния.

В соответствии с документацией на Jquery расширить:

Объединение содержимого двух или более объектов вместе в объектпервый .

Обратите внимание, что в вашем коде:

// jQuery.extend([deep ], target, object1 [, objectN ]) 
$.extend(true, state.serCfgData, data1); 

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

... 
... 
// Babel Stage 3 spread operator 
const newState = {...state}; 

$.extend(true, newState.serCfgData, data1); 
return newState; 

Обратите внимание, что когда вы return {...state}, причина обновляет это вы возвращаете новый объект (оператор Spread создает новый объект.)

Посмотрите на это видео, чтобы понять, как избежать объектные мутации в вашем редукторе:

https://egghead.io/lessons/javascript-redux-avoiding-object-mutations-with-object-assign-and-spread

+1

Да, это правильно. Также см. Информацию в документах Redux о случайных мутациях и неустанно обновлять данные: http://redux.js.org/docs/faq/ReactRedux.html#react-not-rerendering и http://redux.js.org/ docs/recipes/reducers/ImmutableUpdatePatterns.html. Кроме того, пара отмечает: оператор распространения объектов - это этап 3, а не ES6, но ES6 имеет 'Object.assign()'. В любом случае они обычно используются, а не '$ .extend'. – markerikson

+0

Ах, верно, я обновлю свой ответ, чтобы отразить этап 3, а не ES6. –

+0

спасибо, я использовал 'Object.assign()', но этот метод не работает в глубоком объекте – taven

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