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"
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"
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ésitem
: pour décrire comment v-select
doit rendre les éléments lorsqu'ils sont ouvertsCela 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"
Doit avoir les deux slot
y slot-scope
attributs pour le template
étiquette. Ce n'était pas évident pour moi.
Cela fonctionne bien, mais avec l'attribut multiple, on perd la case à cocher pour chaque option.
Merci, nous pouvons aussi écrire ceci comme :item-text="item =>`${item.name} - ${item.description}`"
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é ?
@Inigo En fait, c'est une autre question, vérifiez v-select filter
props, il accepte une fonction avec itemText
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
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 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.