Неожиданное поведение Object.assign () в Immer в Redux - PullRequest
3 голосов
/ 10 июня 2019

Я использую redux-starter-kit (который включает в себя библиотеку Immer для изменяемых обновлений), и по некоторым причинам этот редуктор не работает:

reInitializeState(state, action) {
        state = Object.assign({}, initialState);
        state.someProperty = true; // this does not get set
    },

Но этот работает:

reInitializeState(state, action) {
        Object.assign(state, initialState);
        state.someProperty = true; // this does
    },

Я бы ожидал, что они сделают то же самое.Что здесь происходит?

Ответы [ 3 ]

2 голосов
/ 10 июня 2019

Что вы здесь делаете:

state = Object.assign({}, initialState);

Копирует initialState в новый объект и удаляет содержимое state. Вы должны присваивать state, а не {}, и присваивать результат state.

state = Object.assign(state, initialState);
2 голосов
/ 10 июня 2019

Переназначение переменной само по себе почти никогда не будет иметь никакого эффекта в другом месте. Если вы передадите переменную в качестве параметра, затем переназначите эту переменную, и функция завершится, ничего за пределами функции не увидит никаких изменений. Точно так же:

let someVar = 'foo';
function reassign(str) {
  str = 'bar';
}
reassign(someVar);
console.log(someVar);

Переназначение внутри функции выше ничего не делает, потому что переназначение не меняет то, на что указывает внешнее связывание someVar.

Ваш второй фрагмент:

reInitializeState(state, action) {
    Object.assign(state, initialState);
    state.someProperty = true; // this does
},

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

1 голос
/ 10 июня 2019

С Immer вы изменяете объекты на месте для создания следующей неизменной копии.В первом примере, поскольку state входит в качестве параметра, выполняется:

state = Object.assign({}, initialState);

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

Во втором примере вы не переназначаете state на что-то еще, поэтому вызов state.someProperty и его изменение изменяют исходный объект состояния.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...