Вот мой редуктор редактирования. Он работает нормально, но я хочу использовать метод object.assign - PullRequest
0 голосов
/ 22 марта 2019

Вот мой редуктор, в котором когда идентификатор задачи совпадает с идентификатором полезной нагрузки в действии, он меняет значение, но я хочу использовать метод object.assign.

case EDIT_TODO:

  return state.map(todo => {
    if(todo.id === action.payload.id){
        return {
          ...todo,
         text: action.payload.text
        }
      }
      return todo;
    });

Ответы [ 2 ]

0 голосов
/ 22 марта 2019

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

Если вы хотите добиться того же с помощью Object.assign, вы можете сделать:

case EDIT_TODO:
      return state.map(todo => {
        if(todo.id === action.payload.id){
            return Object.assign({}, todo, text)
          }
          return todo;
        });

Эта строка:

        return Object.assign({}, todo, text)

Говорит "создайте новый пустой объект (первый параметр) и назначьте этому пустому объекту следующие свойства: todo, text (остальные параметры)"

0 голосов
/ 22 марта 2019

В приведенном выше коде вы не изменяете состояние, поскольку Map возвращает новый массив, а также для идентификатора, который соответствует, вы закрываете объект и обновляете его.

Единственное, что другой объект todo все еще содержит ту же ссылку, но это нормально.

И даже если text является объектом, который вы в настоящее время назначаете для него новую ссылку, и если вы хотите объединить, вы можете использовать синтаксис распространения, но из того, что кажется вашим соглашением об именах text, кажется, string, который является javascript Immutable

case EDIT_TODO:

  return state.map(todo => {
    if(todo.id === action.payload.id){
        return {
          ...todo,
         text: action.payload.text
        }
      }
      return todo;
    });
...