Vue.js 中有没有办法在使用 v-for 时生成分隔符(类似于 `Array.join()` FreeMarker 的 `<#sep>`)
Is there a way in Vue.js to generate a separator when using v-for (similar to `Array.join()` FreeMarker's `<#sep>`)
使用 vue.js 和 v-for 我想生成一个 <span>
元素的列表,这些元素由 ", " 分隔。
在 vue.js 中是否有针对此问题的简单解决方案?
在JavaScript我会做一个users.join(", ")
。
或者在FreeMarker templates you can use quite fancy things with lists我喜欢用,例如
<#list users as user>
<span>
${user}<#sep>, </#sep>
</span>
<#else>
<p>No users</p>
</#list>
在 vue 中我还没有发现类似的东西。 (当然,else
部分可以使用 v-if 和 v-else 完成。)我错过了什么吗?
或者有什么替代解决方案?如果这不是最后一个索引,我正在考虑使用模板生成分隔符,方法是将当前索引与数组的长度进行比较。但是,如果我遍历对象的属性,这将不起作用。
对于字符串数组,您可以这样做:
<span v-if="users && users.length > 0">
<template v-for="(user, index) in users">
<template v-if="index < users.length - 1">
{{ user }},
</template>
<template v-else>
{{ user }}
</template>
</template>
</span>
<p v-else>
No users
</p>
"iterate over the properties of an object" 是什么意思?
您可以使用计算的 属性 和 return 常规 JS 版本,然后您根本不需要 v-for。如果您想要或需要在模板中执行逻辑,这可能是更好的方法。
这是 fiddle
模板:
<div id="app">
<h2>Users:</h2>
<span>
{{ listUsers }}
</span>
</div>
JS:
new Vue({
el: "#app",
data: {
users: [
'Jim',
'John',
'Sarah',
'Steve'
]
},
computed: {
listUsers() {
return this.users.join(', ')
}
}
})
编辑:
如果您想遍历对象属性,您也可以在计算的 属性 中使用 Object.keys,并将属性映射到数组,然后按常规方式加入。
这是 fiddle
模板:
<div id="app">
<span>
{{ listProps }}
</span>
</div>
JS:
new Vue({
el: "#app",
data: {
user: {
name: 'Dwight',
age: 32,
animal: 'Bears',
food: 'Beets',
show: 'Battlestar Galactica'
}
},
computed: {
listProps() {
return Object.keys(this.user).map(key => `${key}: ${this.user[key]}`).join(", ");
}
}
})
是的。它需要使用 <template>
元素作为无标记容器和列表中的 index
属性。
<div>
<template v-for="(user, index) in users">
<template v-if="index > 0">,</template>
<span>{{user}}</span>
</template>
</div>
使用 vue.js 和 v-for 我想生成一个 <span>
元素的列表,这些元素由 ", " 分隔。
在 vue.js 中是否有针对此问题的简单解决方案?
在JavaScript我会做一个users.join(", ")
。
或者在FreeMarker templates you can use quite fancy things with lists我喜欢用,例如
<#list users as user>
<span>
${user}<#sep>, </#sep>
</span>
<#else>
<p>No users</p>
</#list>
在 vue 中我还没有发现类似的东西。 (当然,else
部分可以使用 v-if 和 v-else 完成。)我错过了什么吗?
或者有什么替代解决方案?如果这不是最后一个索引,我正在考虑使用模板生成分隔符,方法是将当前索引与数组的长度进行比较。但是,如果我遍历对象的属性,这将不起作用。
对于字符串数组,您可以这样做:
<span v-if="users && users.length > 0">
<template v-for="(user, index) in users">
<template v-if="index < users.length - 1">
{{ user }},
</template>
<template v-else>
{{ user }}
</template>
</template>
</span>
<p v-else>
No users
</p>
"iterate over the properties of an object" 是什么意思?
您可以使用计算的 属性 和 return 常规 JS 版本,然后您根本不需要 v-for。如果您想要或需要在模板中执行逻辑,这可能是更好的方法。 这是 fiddle
模板:
<div id="app">
<h2>Users:</h2>
<span>
{{ listUsers }}
</span>
</div>
JS:
new Vue({
el: "#app",
data: {
users: [
'Jim',
'John',
'Sarah',
'Steve'
]
},
computed: {
listUsers() {
return this.users.join(', ')
}
}
})
编辑:
如果您想遍历对象属性,您也可以在计算的 属性 中使用 Object.keys,并将属性映射到数组,然后按常规方式加入。
这是 fiddle
模板:
<div id="app">
<span>
{{ listProps }}
</span>
</div>
JS:
new Vue({
el: "#app",
data: {
user: {
name: 'Dwight',
age: 32,
animal: 'Bears',
food: 'Beets',
show: 'Battlestar Galactica'
}
},
computed: {
listProps() {
return Object.keys(this.user).map(key => `${key}: ${this.user[key]}`).join(", ");
}
}
})
是的。它需要使用 <template>
元素作为无标记容器和列表中的 index
属性。
<div>
<template v-for="(user, index) in users">
<template v-if="index > 0">,</template>
<span>{{user}}</span>
</template>
</div>