Vue - проверьте, используете ли вы последнюю опору цикла v-for
Если у меня есть следующее свойство данных:
person: {name: 'Joe', age: 35, department: 'IT'}
И хотел перебрать и вывести его следующим образом:
name: Joe, age: 35, department: IT
Пока что у меня есть:
<span v-for="(val, key) in person">{{key}}: {{val}}, </span>
Но это показывает:
name: Joe, age: 35, department: IT,
с дополнительной запятой на конце, как я могу обнаружить, что это последняя пропа, и не показывать запятую? Я думаю, что v-show или v-if могут быть решением, но я не могу понять, как заставить это работать.
7 ответов
Вот один из способов.
<span v-for="(val,key,index) of person">key: {{key}}, val: {{val}}<span v-if="index != Object.keys(person).length - 1">, </span></span>
Работает отлично
<div id="app">
<div v-for="(item, index) in items">
<div v-if="index == items.length - 1">yes</div>
{{ item }}, {{ index }}
</div>
</div>
Вы также можете "обмануть", вставляя запятую перед каждым элементом, так как легче проверить первый элемент (key !== 0
).
<span v-for="(val, key) in person">
<span v-if="key !== 0">, </span>
{{key}}: {{val}}
</span>
Вы можете сделать это с computed
чтобы увидеть, если текущий индекс (третий параметр дляv-if
) является последним свойством:
computed: {
last(){
return Object.keys(this.person).length-1;
}
}
Тогда в вашем v-for
:
<span v-for="(val, key, index) in person">{{key}}: {{val}}<span v-if="index !== last">, </span> </span>
Вот JSFiddle: https://jsfiddle.net/wv2ujxvn/
Это тоже работает.
<span v-for="(value,key) in persons" :key='key'>
{{key}}: {{val}}
<span v-if="key+1 != persons.length">, </span>
</span>
Жаль, что во Vue нет ярлыка.
Лично я предпочитаю использовать небольшой CSS:
<div class="list">
<span>Item 1</span>
<span>Item 2</span>
<span>Item 3</span>
</div>
.list span:not(:last-child)::after {
content: ',';
}
Если вы хотите сохранить знания об этом шаблоне в коде, а не в переполнении стека, вы можете создать такой компонент:
<template>
<span v-if="show"><slot></slot></span>
</template>
<script>
export default {
name: 'separator',
props: ['items', 'index'],
computed: {
show () {
return this.index !== (Array.isArray(this.items) ? this.items : Object.keys(this.items)).length - 1
}
}
}
</script>
Это не обязательно делает код замкнутым, но его легче запомнить:
<span v-for="(val, key, index) of person">key: {{key}}, val: {{val}}<separator :items="person" :index="index">, </separator></span>