75 votes

Personnalisation du texte de l'élément dans le v-select

Veuillez me dire si nous pouvons personnaliser item-text para v-select ?

Je veux personnaliser chaque élément dans v-select quelque chose comme ça :

:item-text="item.name - item.description"

154voto

Toodoo Points 2423

Oui, vous pouvez, en utilisant scoped slot comme décrit dans le doc et fournir un template .

Pour v-select vous avez deux scoped slot :

  • selection : pour décrire comment v-select doit rendre les éléments lorsqu'ils sont sélectionnés
  • item : pour décrire comment v-select doit rendre les éléments lorsqu'ils sont ouverts

Cela ressemble à ceci :

<v-select> // Don't forget your props
  <template slot="selection" slot-scope="data">
    <!-- HTML that describe how select should render selected items -->
    {{ data.item.name }} - {{ data.item.description }}
  </template>
  <template slot="item" slot-scope="data">
    <!-- HTML that describe how select should render items when the select is open -->
    {{ data.item.name }} - {{ data.item.description }}
  </template>
</v-select>

CodePen avec un exemple complexe

Doc Vuetify à propos de l'emplacement dans V-Select


Éditer pour Vuetify 1.1.0+ : Ces créneaux sont également disponibles avec de nouveaux composants v-autocomplete y v-combobox comme ils héritent de v-select .


Modifier pour Vue 2.6+ , remplacer :

  • slot="selection" slot-scope="data" par v-slot:selection="data"
  • slot="item" slot-scope="data" par v-slot:item="data"

2 votes

Doit avoir les deux slot y slot-scope attributs pour le template étiquette. Ce n'était pas évident pour moi.

3 votes

Debe ser <template v-slot:item="data"> à partir de vue 2.6

1 votes

Cela fonctionne bien, mais avec l'attribut multiple, on perd la case à cocher pour chaque option.

65voto

Mohsen Points 143

Abréviation de :

:item-text="item => item.name +' - '+ item.description"

11 votes

Merci, nous pouvons aussi écrire ceci comme :item-text="item =>`${item.name} - ${item.description}`"

1 votes

La seule solution qui a fonctionné pour moi, car je voulais que ce soit pour une sélection "multiple" - y a-t-il une chance que je puisse également trier les articles sur la base du texte de l'article personnalisé ?

0 votes

@Inigo En fait, c'est une autre question, vérifiez v-select filter props, il accepte une fonction avec itemText

43voto

br. Points 709

La fente supprime la sélection automatique lors de la mise au point.

item-text tye peut être : string | array | function

alors on peut faire :

:item-text="text"

et

methods: {
  text: item => item.name + ' — ' + item.description
}

2 votes

Et la question est : que signifie le type de tableau ?

1 votes

@P.Scheit, .join(',') alias. Essaie juste

0 votes

:item-value peut également être utilisé pour définir la valeur sélectionnée.

29voto

Marcelo Vinicius Points 159

Voici un exemple simple dans le code suivant :

<template>
  <v-select
    label="Names"
    v-model="name"
    :items="names"
    item-value="id"
    item-text="name"
    return-object
  >
    <template v-slot:selection="{ item }">
      {{ getText(item) }}
    </template>
    <template v-slot:item="{ item }">
      {{ getText(item) }}
    </template>
  </v-select>
</template>

<script> 
export default {
  data: () => ({
    names: [
      { id: 1, name: 'Paul', age: 23 },
      { id: 2, name: 'Marcelo', age: 15 },
      { id: 3, name: 'Any', age: 30 },
    ],
    name: null,
  }),
  methods: {
    getText(item) => `${item.name} - ${item.text}`,
  },
}   
</script>

La référence est la suivante : https://vuetifyjs.com/en/components/autocompletes#advanced-slots

1 votes

Bel exemple. Merci.

1 votes

Cela fonctionne très bien

0voto

stavroSE Points 9

Si vous ne voulez pas utiliser les slots ou d'autres méthodes pour manipuler le texte des éléments, voici une autre approche pour obtenir le même résultat.

il suffit d'ajouter à la volée une nouvelle paire clé/valeur 'displayname' à votre collection de v-modèles avec une méthode calculée et de l'utiliser comme v-modèle pour la sélection et la nouvelle clé comme texte de l'élément.

computed: {
  addDisplayname() {
    return names.map(v => ({ ...v,
      displayname: v.name + ' - ' + v.description
    }))
  }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X