У меня есть избыточная ветвь, структурированная как:
{
byId: {
1: { id: 1, name: 'Name 1', username: 'Username 1' },
2: { id: 2, name: 'Name 2', username: 'Username 2' },
3: { id: 3, name: 'Name 3', username: 'Username 3' },
...
},
...
}
У меня есть случай запуска действия для изменения имени записи, публикации в моем API, возврата полного объекта (чтобы отразить изменениялокально, если есть другие источники, управляющие моим бэкэндом) и повторно вставляющие его в мое состояние редукции.
Действие:
changeName(id, name) => {
// post to API
const object = <object from API>
dispatch({
type: 'UPDATE_USER',
byId: { id: object }
});
};
Редуктор:
case 'UPDATE_USER':
return update(state, {
byId: { $merge: action.byId }
});
Язапуск этого действия из списка, который отображает строки из byId
- я могу подтвердить это корректно обновляет мой редукс , однако это не вызывает повторное отображение моего списка. Если бы я должен был вызвать другое действие, т.е. удалить строку списка, список будет обновлен, чтобы отразить удаленный элемент, а также changeName
, который ранее не вызывал повторного рендеринга.
Я знаю, что это как-то связано с моим $merge
, и повторновставка с тем же значением key
и более глубоким вложенным изменением field
смешивает мой редукс, чтобы не заметить изменения состояния, но я не уверен, куда идти.
Спасибо
- edit: я также использую пользовательский селектор для этого списка, который использует lodash / isEqual
export default createSelectorCreator(defaultMemoize, isEqual);
Я также пробовал:
return update(state, {
byId: {
[action.id]: { $set: action.data }
}
});
без удачи