@KirylLapouski

Почему не работает создание объекта?

Почему не получается объединить объект? Вот ошибка:

5aeaef0a92f9d154547443.png
Вот код:

const courses = (state = {}, action) => {
  switch (action.type) {
    case constants.courses.CREATE_COURSE:
      return {
          ...state,
          action.title:{
              title:action.title
          }
      }
  }
  return state;
}
  • Вопрос задан
  • 116 просмотров
Решения вопроса 3
0xD34F
@0xD34F
Почему не работает - вам написали, синтаксическая ошибка.

Возьмите ваш action.title в кавычки, либо в квадратные скобки - в зависимости от того, что вам нужно. В первом случае именем свойства будет "action.title", во втором - значение action.title.

Кстати, а что нужно? Очевидно, второй вариант - значение action.title должно стать ключом, но что дальше? Ведь получится, что ключ и значение свойства вложенного объекта совпадают, а больше в этом вложенном объекте ничего и нет. Будет ли он дополняться в будущем чем-то ещё? Если нет, было бы логичнее складывать эти title'ы в массив вместо создания отдельного объекта под каждый. Если да, то в случае, если объект с указанным title'ом уже существует, его свойства будут потеряны. Так и задумано? Если нет, то их надо копировать:

return {
  ...state,
  [action.title]: {
    ...state[action.title],
    title: action.title,
  },
};
Ответ написан
Комментировать
maxfarseer
@maxfarseer
https://maxpfrontend.ru, обучаю реакту и компании
Дополню ответ 0xD34F - нельзя в качестве названия свойства указывать что-то через точку.

return {
          ...state,
          название_поля:{
              title:action.title
          }
      }


где вместо название_поля должна быть строка! Если вы хотите, чтобы это было вычисляемое выражение, то нужно добавлять (как уже сказано было) квадратные скобки, то есть:

return {
          ...state,
          [action.title]:{
              title:action.title
          }
      }


Но я думаю 99% вам хочется чего-то не такого, ибо в таком случае у вас получается что в state будет установлен title в поле с таким названием, которое вам придет в action.title, например:

return {
          ...state,
          dollar:{
              title: "dollar" // предположим что в action.title строка "dollar"
          }
      }


Чтобы разобраться - теория.

p.s. тэг "функциональное программирование" тут смотрится слишком опасно)
Ответ написан
@Qeemerc
Frontend developer
Скорее всего, код должен быть таким.
const courses = (state = {}, action) => {
  switch (action.type) {
    case constants.courses.CREATE_COURSE:
      return {
          ...state,
          [action.title]: {
              title:action.title
          }
      }
  }
  return state;
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы