Je sais que dans VueJS, je peux parcourir un tableau:
<span v-for="(element, index) in list">{{ element }}</span>
Mais si je voulais une liste séparée par des virgules? Par exemple, si list = ["alice", "bob", "chuck"]
, alors ce qui précède produira:
<span>alice</span><span>bob</span><span>chuck</span>
Ce que je veux, cependant, c'est:
<span>alice</span>, <span>bob</span>, <span>chuck</span>
Est-ce possible?
Ce que j'ai fini par faire à la place était:
<span v-for="element in list" class="item">
<span>{{ element }}</span>
</span>
Et en CSS:
.item + .item:before {
content: ", ";
}
Vous pouvez utiliser le rendu conditionnel pour masquer le dernier ,
comme suit:
var demo = new Vue({
el: '#demo',
data: function() {
return {
lists: ['Vue', 'Angular', 'React']
};
}
})
<script src="https://vuejs.org/js/vue.min.js"></script>
<div id="demo">
<span v-for="(list, index) in lists">
<span>{{list}}</span><span v-if="index+1 < lists.length">, </span>
</span>
</div>
Si tout ce qui vous préoccupe est de séparer les virgules, utilisez la méthode join intégrée de Javascript:
{{ list.join(', ') }}
Solution utilisant "template"
<template v-for="(element, index) in list">
<span>{{element}}</span><template v-if="index + 1 < list.length">, </template>
</template>
Si vous voulez le faire de la manière JS, vous pouvez simplement faire une propriété calculée; vous pouvez même continuer la méthode span.
computed {
listCommaSeparated () { return this.list.join(', '); },
listCommaSpans () { return '<span>' + this.list.join('</span><span>') + '</span>'; },
},
Ce serait certainement le moyen privilégié du point de vue des performances de rendu.
Vous pouvez le faire en utilisant un attribut v-if
avec une condition sur le premier argument, en évitant l’utilisation de .length
:
var app = new Vue({
el: '#app',
data: {
list: ['john', 'fred', 'harry']
}
})
<script src="https://vuejs.org/js/vue.min.js"></script><div id="app">
<span v-for="(element, index) in list">
<span v-if="index != 0">, </span><span>{{ element }}</span>
</span>
</div>
Mieux vaut utiliser la méthode JS Array.join
intégrée comme celle-ci
<span>{{ list.join(', ') }}</span>
Puis-je suggérer d'utiliser i> 0 comme chèque?
J'ai encapsulé le séparateur pour que {{''}} puisse être utilisé uniquement pour un espace et pour éviter que span soit traité comme étant vide.
<span
v-for="(item, i) in list"
:key="i">
<span v-if="i>0">{{ ', ' }}</span>
<span class="text-nowrap">{{ item }}</span>
</span>
ou
<span
v-for="(item, i) in list"
:key="i">
<!-- if not wrapped in a span will leave a space before the comma -->
<span>{{ (i > 0 ? ', ' : '') }}</span>
<span class="text-nowrap">{{ item }}</span>
</span>
Juste en ajoutant une autre alternative que je préfère utiliser:
<span v-for="(item, index) in list">
{{ item }}{{ (index+1 < list.length) ? ', ' : '' }}
</span>
Son échantillon possible<span v-for="(item,i) in items">
{{(item !='' && i !=0) ? ',' : ''}} {{item.title}}
</span>
Mon composant:
<template>
<ul v-if="model.length">
<li v-for="item in model">{{item}}</li>
</ul>
</template>
<style scoped>
ul {
list-style: none;
}
li {
display: inline-block;
}
li:not(:last-child)::after {
content: ", ";
}
</style>
<script>
export default {
props: ['model']
};
</script>