Как получить объект с помощью объекта

Я пытаюсь получить ИМЯ из списка в таблице данных. Итак, ниже приведен код, который я написал.

HTML-шаблон -

<v-data-table :headers = "headers" :items = "topics" :footer-props = "{'items-per-page-options': [5, 10, 20, 40]}" :items-per-page = "10" item-key = "srno">
   <template v-slot:item.skillName = "{ item }">
       <span>{{ item.skillName || '-' }}</span>
   </template>
</v-data-table>
export default {
  data () {
    return {
      skills: [
        {
          name: ''
        }
      ],
      topics: [],
      headers: [
        { text: 'Sr No', value: 'srno', align: 'center', sortable: true },
        { text: 'Skills', value: 'skills', align: 'center' },
      ],
      skillName: [],
    }
  },
  created: async function () {
    await this.getAllList()
  },
  methods: {

    getAllList: async function () {
      try {
        this.isLoading = true
        let r = []
        let res = await http.get(`${CONSTANTS.API_URL}/api/getall-themes`, {
          params: {
            page: this.page - 1,
            size: this.pageSize
            // search: this.search
          }
        })
        this.topics = res.data.rows.map((item, index) => {
          item.srno = this.pageSize * (this.page - 1) + index + 1
          item.skillName = item.Skills ? item.Skills.name : '-'
          return item
        })
              this.totalPages = res.data.totalPages
      } catch (e) {
        const errorMessage = (e && e.response && e.response.data.message) || e.message
        this.errMsg(errorMessage)
      } finally {
        this.isLoading = false
      }
    },

ОШИБКА - skillName становится неопределенным.

Ожидаемый результат — Письмо, Пение должны войти в skillName

Поведение ключевого слова "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) для оценки ваших знаний,...
2
0
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Вы не объявляете столбец skillnName в заголовке, только skills:

Пытаться:

export default {
  data () {
    return {
      ...
      headers: [
        { text: 'Sr No', value: 'srno', align: 'center', sortable: true },
        { text: 'Skills',
           value: 'skills', // <---- probably should be skillName
           align: 'center' },
      ],
    }
  },

или

<v-data-table :headers = "headers" :items = "topics" :footer-props = "{'items-per-page-options': [5, 10, 20, 40]}" :items-per-page = "10" item-key = "srno">
   <template v-slot:item.skills = "{ item }"> <!-- <-------- slot name should match header.value -->
       <span>{{ item.skillName || '-' }}</span>
   </template>
</v-data-table>

Кроме того, по вашим данным, вы хотите использовать здесь массив, поэтому вам нужно создать из него что-то для печати. Попробуйте что-то вроде {{ item.Skills.map(s => s.name).join(',') || '-' }} в шаблоне.

Если вам не нужны сложные выражения в шаблоне, у вас есть другие варианты:

  • создайте метод для компонента, чтобы он был {{ formatSkills(item) }}
  • если элементы являются экземплярами классов, создает метод в классе, поэтому вы можете сделать: {{ item.getSkillsString() }}
  • после загрузки ваших данных создайте свойство для каждого элемента с объединенным значением, например:
async fetchData(){
  const items = await loadItems()
  items.forEach(item => item.skillsCsv = item.Skills.map(s => s.name).join(',')
}

Последний обычно является предпочтительным вариантом в Vue, он позволяет вам работать без слота, просто установите новое свойство в объявлении заголовка:

{ text: 'Skills', value: 'skillsCsv', align: 'center' },

Однако обратите внимание, что это не реактивно, если вы добавляете навыки к предмету, вам нужно перестроить реквизит `skillsCsv` вручную (или вы обрабатываете его через сеттер).

Конечно, вы всегда можете использовать Skills прямо в шаблоне:

   <template v-slot:item.Skills = "{ item }">
     <span v-for = "skill in item.Skills" :key = "skill.id">
       {{ skill.name}}
     </span>
   </template>

измените значение, но все равно оно показывает undefined

Jazz 05.02.2023 13:52

@kiran только что обновил его, {{ item.name || '-' }} работает?

Moritz Ringler 05.02.2023 13:55

@mortiz это будет МУЗЫКАЛЬНАЯ ТЕМА. Ниже есть еще один элемент, называемый именем, он принимает свое значение.

Jazz 05.02.2023 13:56

@Mortiz Вместо того, чтобы делать это в шаблоне, можем ли мы сделать это в функции?

Jazz 05.02.2023 14:04

@kiran Обновил ответ, забыл самое очевидное решение, лол

Moritz Ringler 05.02.2023 14:59

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