1

我正在使用 v-autocomplete 组件来列出选择器中的项目。由于 v-autocomplete 只是一个高级 v-select,我认为 v-select 的答案也适用于 v-autocomplete。

在我的列表中,我有不同状态的项目,应该以某种方式标记。所以我想根据项目属性向选项添加一个数据属性。如果我可以添加至少一个不同的类,那也会有所帮助。但是由于我没有任何选项元素来添加这些属性,所以我找不到方法来做到这一点。

我的项目看起来像:

{value:1,text:"Option 1",status:"finished"},{value:2,text:"Option 2",status:"running"},{value:3,text:"Option 3",status:"scheduled"}

这个想法是根据它们的状态以不同的方式为选择中的选项设置样式。所以我想实现类似:

<v-autocomplete
    v-model="selectedItem"
    :items="items"
    :item-status="item.status">
</v-autocomplete>

这可能吗?

4

2 回答 2

0

听起来您需要的是利用可用于 v-autocomplete 元素的item 插槽。

<template v-slot:item="{ item }">
  <div :class="getItemClass(item)">
    {{ item.text }}
  </div>
</template>

除了使用getItemClass(item)方法,您还可以将status: className配对保存在组件数据/计算中的对象中。语法将更改为itemClass[item].

该插槽允许您自定义下拉列表中的列表项。您甚至可以使用它添加具有不同颜色的不同图标来表示项目状态。

如果在选择项目时想要自定义外观,您可以为selection 插槽创建类似的模板。

于 2021-11-08T15:11:22.703 回答
0

selected您可以根据 设置选项的样式status,这是基本的想法,但可以肯定的是,您可以使其更具动态性。

    new Vue({
      el: '#app',
      vuetify: new Vuetify(),
      data () {
        return {
        auto: [{value:1,text:"Option 1",status:"finished"},{value:2,text:"Option 2",status:"running"},{value:3,text:"Option 3",status:"scheduled"}],
          selectedAuto: '',
        }
      },
    })
   


    <link href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900" rel="stylesheet">
    <link href="https://cdn.jsdelivr.net/npm/@mdi/font@4.x/css/materialdesignicons.min.css" rel="stylesheet">
    <link href="https://cdn.jsdelivr.net/npm/vuetify@2.x/dist/vuetify.min.css" rel="stylesheet">
    <script src="https://cdn.jsdelivr.net/npm/vue@2.x/dist/vue.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/vuetify@2.x/dist/vuetify.js"></script>

    <div id="app">
    <v-app id="inspire">
     <v-autocomplete
       v-model="selectedAuto"
        :items="auto"
         :item-status="auto.status"
>

      <template slot="selection" slot-scope="data">
      <!-- HTML that describe how select should render selected items -->
       <v-list-item-action-text>
        <span v-if="data.item.status == 'finished'" class="green--text">
             {{ data.item.text }}  
        </span>
        <span v-if="data.item.status == 'running'" class="red--text">
             {{ data.item.text }}  
        </span>
        <span v-if="data.item.status == 'scheduled'" class="blue--text">
             {{ data.item.text }} 
        </span>

        </v-list-item-action-text>
    </template>
                            
    <template slot="item" slot-scope="data">
    <!-- HTML that describe how select should render items when the select is open -->
        <v-list-item-action-text>
            {{ data.item.text }}
        </v-list-item-action-text>
     </template>
</v-autocomplete>
</v-app>
    </div>

于 2021-11-08T15:19:50.060 回答