Перебирать объекты, используя Object.entries

У меня есть компонент comobox для отображения тегов из запроса API. Компонент получает теги в качестве реквизита в следующем формате:

"tags": [ { "name": "Rejected" }, { "name": "Accepted" } ] }

Я пытаюсь получить значение name и сделать его как v-model, чтобы отображать теги, сохраненные в БД, и сохранять новые теги, если пользователям нужно их обновить. Вот код комобокса:

 <v-container fluid>
  <v-combobox
    v-model = "model"
    :items = "items"
    :search-input.sync = "search"
    hide-selected
    hint = "Maximum of 5 tags"
    label = "Add some tags"
    multiple
    persistent-hint
    small-chips
  >
    <template v-slot:no-data>
      <v-list-item>
        <v-list-item-content>
          <v-list-item-title>
            No results matching "<strong>{{ search }}</strong>". Press <kbd>enter</kbd> to create a new one
          </v-list-item-title>
        </v-list-item-content>
      </v-list-item>
    </template>
  </v-combobox>
</v-container>

Реквизит

props:{
  value:{
    required: true,
    type:Object
  }
}

вычисленный

computed: {
  model() {
   return Object.entries(this.value.tags).forEach(([key,value]) => {
     return this.model = value
   })
  }
},

Проблема, когда я пытаюсь получить значение с помощью Object.entries (что-то, что я хочу использовать для перебора свойств):

TypeError: невозможно преобразовать undefined или null в объект

Оператор return внутри forEach не действует. tags содержит массив, поэтому Object.entries() будет иметь неожиданный результат. Независимо от всего этого, ясно, что this.value.tags — это undefined или null. Введите это в консоли и посмотрите, как это работает: Object.entries({name: 'test', number: 42})

Randy Casburn 14.12.2020 06:40

так как forEach над неопределенным или нулевым типом?

AlmoDev 14.12.2020 06:57

эм... ты не можешь. forEach() — это метод объекта Array (и некоторых других объектов типа Array) в JavaScript. Это означает, что вы часто вызываете его из действительного объекта Array. Пустой объект по-прежнему является объектом, поэтому [].forEach(console.info); работает, но ничего не делает, так как нечего перебирать.

Randy Casburn 14.12.2020 07:03

Вы говорите, что нет решения этого вопроса?

AlmoDev 14.12.2020 07:05
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
4
666
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ошибка

Ошибка Cannot convert undefined or null to object указывает на то, что this.value.tags еще не определено при вычислении. Вычисляемый реквизит запускается при инициализации до предоставления value. Одним из решений является указание значения по умолчанию в объявлении свойства, которое содержит начальную tags:

export default {
  props: {
    value: {
      default: () => ({ tags: [] })
    }
  }
}

Извлечение значений из массива tags

Если я правильно понимаю, вы пытаетесь сопоставить значения name из tags[] в массив. Вы можете сделать это с помощью Array.prototype.map:

export default {
  computed: {
    model() {
      // takes the `name` property from each object in `tags[]`
      return this.value.tags.map(({ name }) => name)
    }
  }
}

Привязка к вычисляемой опоре

Я заметил, что вы привязываете model вычисляемую опору к <v-combobox v-model = "model">, но v-model требует свойства, доступного для записи, а model — нет. Вы должны увидеть предупреждение консоли в режиме разработки по этому поводу.

Я думаю, что model действительно должен быть items здесь. Выбранное пользователем значение будет храниться в v-model, так что это должно быть какое-то свойство, объявленное в data() вашего компонента:

<template>
  <v-combobox
    v-model = "selectedItems"
    :items = "model"
  />
</template>

<script>
export default {
  data() {
    return {
      selectedItems: []
    }
  },
  computed: {
    model() { /* ... */ }
  }
}
</script>

Другие вопросы по теме