может ли кто-нибудь помочь мне, что делает ... текущее состояние распространения в этом коде и вообще каково его определение - PullRequest
0 голосов
/ 07 мая 2020
const userReducer = (currentState, action)=>{
  switch (action.type){
   case 'SET_CURRENT_USER':
    return{
     ...currentState (???)
     currentUser: action.payload
    };
   default: 
    return currentState;
   }

Ответы [ 2 ]

0 голосов
/ 07 мая 2020

Это оператор распространения . Вы можете использовать его для создания копии (нового места в памяти) сложных структур данных, таких как массивы и объекты.

Вот пример:

const array1 = [1, 2, 3, 4, 5];
const object1 = {
  a: 'a',
  b: 'b'
};

console.log('array1');
console.log(array1);
console.log('object1');
console.log(object1);

// An exact copy of array1
const array2 = [...array1];

// Here we take the data from array1 and add more data to it.
const array3 = [...array1, 6, 7, 8, 9, 10];

console.log('array2');
console.log(array2);
console.log('array3');
console.log(array3);

// An exact copy of object1
const object2 = {...object1};

// Here we take the data from object1 and add more data to it.
const object3 = {...object1, c: 'c', d: 'd'};

console.log('object2');
console.log(object2);
console.log('object3');
console.log(object3);

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

Надеюсь, это поможет!

0 голосов
/ 07 мая 2020

Итак, вы хотите обновить состояние.

Но для того, чтобы это сработало, чтобы реакция не пропустила повторную визуализацию, вам нужно вернуть новый объект. Если вы вернете один и тот же объект, react будет сравнивать новый и старый объект, заметить, что это один и тот же неглубокий объект, и пропустить рендеринг.

Итак, чтобы создать новый объект, вы можете сделать несколько вещей, но Самый большой - это оператор распространения: .... Он разбирает объект и возвращает все значения внутри. Это работает для массивов, строк и объектов.

Итак, возвращая все записи в новый объект, вы создаете неглубокую копию: то же содержимое, но новую ссылку на объект.

Итак, что происходит здесь: :

  1. Вы создаете новый объект return {}
  2. Вы заполняете его текущим объектом, добавляя все записи из currentState в новый объект состояния {...currentState}. Это дает новый объект, но все записи копируются в новый объект.
  3. И, наконец, вы отменяете запись, которую хотите переопределить. Будет выбран последний экземпляр. Это будет выглядеть так:

    return{
       otherEntries,
       currentUser: currentState.currentUser, 
       currentUser: action.payload
    };
    
...