我试图在vutify中创建一个v-select组件,它从API获取数据并将其显示为选项,但奇怪的是,收到的json数据在对象中有一个对象,并且无法访问:(
以下是我的代码:

<template>
  <Comp v-model="trainer" class="mt-10 mb-20 text" />
</template>

<script>
  import Comp from './Comp.vue'
  export default {
    components: {
      Comp,
    },
    data() {
      return {
        trainer: '',
      }
    },
  }
</script>

下面是Comp组件:

<template>
  <v-select
    label=" trainer"
    v-model="selected"
    v-bind="$attrs"
    :item-props="itemProps"
    :items="items"
  ></v-select>
</template>

<script>
  export default {
    props: ['value'],
    data() {
      return {
        selected: this.value,
        items: [
          {
            id: 7,
            user: {
              first_name: 'john',
              last_name: 'Doe',
              phone_number: '0910087634',
              email: 'test@gmail.com',
            },
            specializations: null,
            bio: '  hello',
            image: '',
            birthdate: '2024-01-01',
            gender: 'male',
            experience_years: 7,
          },
        ],
      }
    },
    methods: {
      itemProps(item) {
        return {
          title: item.user.first_name,
          subtitle: item.id,
        }
      },
    },
    computed: {
      selected: {
        get() {
          return this.value
        },
        set(val) {
          this.$emit('input', val)
        },
      },
    },
  }
</script>

这部分代码运行良好:

itemProps(item) {
        return {
          title: item.bio,
          subtitle: item.id,
        }
      },

但是当你想通过item.user.first_name而不是item.bio的时候,它就会出错,我不知道. 以下是前playground名:

推荐答案

在您的代码中,我发现了两个问题:

  • 您有一个不明确的属性( Select 作为数据,并 Select 作为计算的),删除seleted个数据以解决此歧义,
  • 如果选定值将user作为嵌套对象,则不会判断该值.如果选定的值没有嵌套的user对象,则item.user.first_name不起作用(这是您的初始值,选定的是空字符串).

以下是针对您的问题的解决方案:

<template>
  <v-select
    label=" trainer"
    v-model="selected"
    v-bind="$attrs"
    :item-props="itemProps"
    :items="items"
  ></v-select>
</template>

<script>
  export default {
    props: ['value'],
    data() {
      return {
        items: [
          {
            id: 7,
            user: {
              first_name: 'john',
              last_name: 'Doe',
              phone_number: '0910087634',
              email: 'test@gmail.com',
            },
            specializations: null,
            bio: '  hello',
            image: '',
            birthdate: '2024-01-01',
            gender: 'male',
            experience_years: 7,
          },
        ],
      }
    },
    methods: {
      itemProps(item) {
        return {
          title: item.user?.first_name,
          subtitle: item.id,
        }
      },
    },
    computed: {
      selected: {
        get() {
          return this.value
        },
        set(val) {
          this.$emit('input', val)
        },
      },
    },
  }
</script>

Vue.js相关问答推荐

使用插槽的VUE 3工作台

当用户在嵌套路由中时激活链接

在 Vue 中删除自定义组件代码重复的方法?

何时将代码拆分为 Nuxt 中的组件?

两个div元素之间的vue2过渡

混合使用 React 和 Vue 是个好主意吗?

Webpack - MiniCssExtractPlugin 不提取文件

VueJS:为什么在input事件处理程序中触发Input输入事件?

如何在 Vue.js 中获取完整的当前日期和时间,而无需编写大量 JavaScript 行

Vuetify Datatable - 在所有列上启用内容编辑

是否可以在没有 Vue 的情况下使用 Vuex?

为什么Vue.js 使用单字标签

Vue.js + Vuex:如何改变嵌套项状态?

Vuejs:我应该在 vue-router SPA 中的哪里放置一些常用的 js 工具?

Vue路由安全

如何将数据传递给 Vue.js 中的路由视图

如何告诉 Vue-cli 我的应用程序的入口点在哪里?

我应该将所有数据存储在 vuex 状态

beforeCreate 挂钩中的 Vue 2.1 调用方法不起作用

Vue.js react性如何在幕后工作?