Хранение Map и других подобных сущностей в стейте Redux
Наткнулся сегодня на интересную вещь в редаксе: Если в стейте редакса хранить Map, тогда мы можем изменять состояние стейта до того, как экшен вернет объект, при этом реакт будет использовать актуальное значение стейта при его вызове до того как перерисует компонент. Вопрос в том, как использовать мапы и подобные вещи вместе с редаксом, чтоб не нарушать правило "изменить стейт можно лишь отправкой экшена" ? Я конечно могу вызывать изменение мапы внутри экшена, но тогда в любом случае, возврат объекта экшеном не имеет смысла, ведь мапа уже изменена! Упрощенный пример:
//структура стейта в редаксе по умолчанию{ state: new Map(1, 100) }
function Component({TestReducer}) {
return <button onClick={ ()=> {
TestReducer.state.set(1, 1);
console.log(TestReducer.state); // (1, 1) а не (1, 100)
} />
}
export.default connect.....
Ответы (1 шт):
Да, javascript и редакс позволяют вам здесь обмануть самого себя.
Редакс задумывался для работы с неизменяемыми объектами, и для корректной работы ожидает именно их.
Я стараюсь работать с неизменяемыми объектами. Неизменяемость позволяет оптимизировать рендер. Обеспечивает атомарное обновление состояния (действие или полностью произведено или полностью нет), что уменьшает количество ошибок. Может быть реализован Undo/Redo и просмотр истори. Код становится более предсказуемым.
Иногда полезно бывает сереализовать состояние в json и обратно. Несет ли Map в состоянии достаточную пользу?
Реакт -- библиотека (и это хорошо), она не заставляет использовать именно редакс. Есть встроенные в раект useState/useContext и множество альтернативных библиотек управления состоянием. https://stateofjs.com/