Что мешает коду изменить состояние магазина?

store имеет метод, называемый getState это вернет текущее состояние магазина.

Что мешает коду где-то в моем приложении (случайно) изменить возвращенный state от store?

Допустим, я называю это:

let state = store.getState();
state.someProperty = 'fun';

Реализация, которую я нашел на getState на store object просто возвращает объект внутреннего состояния, который перезаписывается при каждом новом действии.

const getState = () => state;

Между действиями / новыми состояниями что мешает коду изменять состояние, которое будет прочитано другим подписчиком? В моем примере выше, настройка someProperty в 'fun' будет сохраняться внутри store на state свойство, пока не перезаписано.

Хотя я, очевидно, не должен изменять состояние, простая ошибка может связать состояние с некоторым компонентом, который (по незнанию) изменяет свои входные данные - возможно, при двухстороннем связывании в угловой среде?

<app-some-component [user]="state"></app-some-component>

не должны getState() быть реализован как клон его state модель?

PS Это не имеет никакого отношения к Angular, поэтому я не добавил тег, чтобы позволить большему количеству людей, не привыкших к Angular, отвечать на вопрос.

1 ответ

Решение

Ответ: ничего:)

Базовая библиотека Redux технически сама по себе не заботится, видоизменяется ли состояние или нет. Вы могли бы на самом деле видоизменить ваши редукторы, или другие части вашего приложения могли бы получить дерево состояний и видоизменить его, и сам магазин не знал бы об этом или не заботился.

Однако, мутация сломает отладку путешествий во времени, а также сделает тесты ненадежными. Что еще более важно, библиотека React-Redux предполагает, что вы будете обрабатывать свое состояние неизменно, и полагается на поверхностные сравнения на равенство, чтобы увидеть, изменилось ли состояние. (Это причина, почему "Почему мой компонент не рендерится?" Есть в FAQ по Redux. В 99,9% случаев это происходит из-за случайной мутации.)

Если вас беспокоит мутация, вы можете использовать библиотеку типа Immutable.js вместо простых JS-объектов или использовать один из нескольких инструментов для замораживания своего состояния в процессе разработки, чтобы поймать мутации.

Другие вопросы по тегам