Разрушение состояния по умолчанию в redux reducer

В чем разница в возврате состояния в случае по умолчанию в редукторе redux между return state и return { ...state }?


person Paweł Baca    schedule 15.04.2021    source источник


Ответы (4)


Как и React, Redux использует неизменяемость для эффективной проверки обновленных ссылок на объекты на предмет обновленного состояния, поэтому вам никогда не следует напрямую изменять / изменять состояние. В случае большинства редукторов по умолчанию никакие действия не изменили состояние, поэтому вы можете вернуть исходный объект состояния (return state), это безопасно, поскольку оно не было изменено.

Однако return { ...state } вернет идентичное состояние, но с другой ссылкой на объект верхнего уровня, что приведет к ненужным проверкам измененного состояния. Если вы вообще не изменяете состояние, вы всегда должны возвращать исходный объект (return state).

РЕДАКТИРОВАТЬ: добавлен следующий вопрос - если вы return { ...state } Redux будет транслировать обновленное состояние всем компонентам React, подключенным к магазину (будь то крючки или функция подключения), а затем React перейдет в обновление своего жизненного цикла. React на самом деле очень эффективен и использует мемоизацию и другие методы, чтобы остановить любые дорогостоящие повторные рендеринг или перерисовку / регенерацию DOM, поэтому разница между двумя с точки зрения процесса будет почти нулевой, это просто ненужно. Я не думаю, что у него даже будет возможность повторно запускать хуки как useEffect, он увидит избыточность, прежде чем добраться туда, или, по крайней мере, использовать кеш мемоизирования и не пересчитывать

person James Morrison    schedule 15.04.2021
comment
Значит, return {...state} не повлияет на повторные рендеры? Только React будет делать проверки данных без надобности? У меня больше не будет повторной визуализации, если у меня будет это состояние редуктора как зависимости в useEffect? - person Paweł Baca; 15.04.2021
comment
Он транслировал обновленное состояние всем компонентам, подключенным к магазину (с помощью крючков или функции подключения), а затем реагировал на обновление своего жизненного цикла. React на самом деле очень эффективен и использует мемоизацию и другие методы, чтобы остановить любые дорогостоящие повторные рендеринг / перерисовку / регенерацию DOM, поэтому разница между двумя с точки зрения процесса практически не будет, это просто ненужно. Я не думаю, что он даже сможет повторно запустить хуки как useEffect, он увидит избыточность ранее или, по крайней мере, использует кеш мемоизирования, а не пересчитывает - person James Morrison; 15.04.2021

Они оба одинаковы при установке состояния по умолчанию. return { ...state } будет иметь смысл, когда вы действительно измените состояние, например

return {
    ...state, 
    valueA: "a"
}

Это обновит все состояние с новым объектом, который имеет обновленное свойство valueA и сохранит все остальные как существующие значения.

person Amila Senadheera    schedule 15.04.2021
comment
Да, я знаю это, но {...state} изменить ссылку, и это повлияет на повторные рендеры, кроме state? - person Paweł Baca; 15.04.2021

ES6 добавил свойство распространения к литералам объектов в javascript. Оператор распространения (…) с объектами используется для создания копий существующих объектов с новыми или обновленными значениями или для создания копии объекта с дополнительными свойствами.

Давайте рассмотрим пример того, как использовать оператор распространения для объекта,

const user1 = {
    name: 'Jen',
    age: 22
};

const clonedUser = { ...user1 };
console.log(clonedUser);

Вывод

Здесь мы выкладываем объект user1. Все пары "ключ-значение" объекта user1 копируются в объект clonedUser. Давайте посмотрим на другой пример слияния двух объектов с помощью оператора распространения,

const user1 = {
    name: 'Jen',
    age: 22,
};

const user2 = {
    name: "Andrew",
    location: "Philadelphia"
};

const mergedUsers = {...user1, ...user2};
console.log(mergedUsers)

введите описание изображения здесь

mergedUsers является копией user1 и user2. Фактически, каждое перечислимое свойство объектов будет скопировано в mergedUsers объект. Оператор распространения - это просто сокращение для метода Object.assign(), но между ними есть некоторые различия.

Чтобы узнать больше, посетите Redux | Использование оператора распространения объектов

person Rashed Rahat    schedule 15.04.2021

Когда вы используете return state, вы возвращаете переменную, это плохо, потому что, если эта переменная изменится, значение, возвращаемое в возврате, также изменится (это известно как побочный эффект).

С другой стороны, если вы используете return { ... state }, вы возвращаете копию значения переменной в этот момент.

person Proskynete    schedule 15.04.2021