2017-02-16 9 views
0

У store есть метод, называемый getState, который вернет текущее состояние магазина.Что предотвращает изменение состояния хранилища?

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

Скажем, я называю это:

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

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

const getState =() => state; 

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

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

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

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

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

ответ

1

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

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

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

Если вас беспокоит мутация, вы можете использовать библиотеку типа Immutable.js вместо простой JS объектов или использовать один из нескольких инструментов для freezing your state in development to catch mutations.

+0

Вы говорите, что мне нужно иметь модель, которая является непреложной (от immutable.js или т. П.), Или мне нужно заморозить мое состояние при тестировании/разработке, но не замораживать в процессе производства? –

+0

Как я уже сказал, в самом Редксе нет ничего, что непрестанно. Даже если вы тщательно пишете код редуктора или используете неизменяемую утилиту для обновления, технически любая часть кода _could_ вызывает 'getState' и мутирует содержимое. Если вы хотите гарантировать, что этого не произойдет, вам нужно использовать что-то другое, кроме простых объектов JS, или что-то, что замерзает простые объекты, чтобы гарантировать, что код нигде не мутирует. Тем не менее, остальная часть приложения, конечно же, не должна пытаться изменять состояние в любом месте, но это случается случайно. – markerikson

+0

Просто не могу не думать, что это плохо - склонно к несчастным случаям - угадайте, что автоматическое тестирование будет более важным, чем когда-либо ... –