我知道在VueJS中我可以遍历一个数组:
<span v-for="(element, index) in list">{{ element }}</span>
但是如果我想要一个逗号分隔的列表怎么办?例如,如果list = ["alice", "bob", "chuck"]
,那么上面会输出:
<span>alice</span><span>bob</span><span>chuck</span>
但我想要的是:
<span>alice</span>, <span>bob</span>, <span>chuck</span>
这可能吗?
答案 0 :(得分:21)
您可以使用conditional rendering隐藏上一个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>
&#13;
$arr = array(1 => 'MP', 2 => 'UP');
echo '<select>';
foreach($arr as $key => $val)
{
echo '<option value="'.$key.'">'.$val.'</option>';
}
echo '</select>';
&#13;
答案 1 :(得分:19)
如果您关心的只是逗号分隔,请使用Javascript的内置join方法:
{{ list.join(', ') }}
答案 2 :(得分:12)
我最终做的是:
<span v-for="element in list" class="item">
<span>{{ element }}</span>
</span>
在CSS中:
.item + .item:before {
content: ", ";
}
答案 3 :(得分:7)
使用“模板”的解决方案
<template v-for="(element, index) in list">
<span>{{element}}</span><template v-if="index + 1 < list.length">, </template>
</template>
答案 4 :(得分:5)
您可以使用v-if
属性,其条件超过第一个参数,避免使用.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>
答案 5 :(得分:3)
如果你想用JS方式做,你可以做一个计算属性;你甚至可以继续使用span方法。
computed {
listCommaSeparated () { return this.list.join(', '); },
listCommaSpans () { return '<span>' + this.list.join('</span><span>') + '</span>'; },
},
从渲染性能的角度来看,这绝对是首选方式。
答案 6 :(得分:3)
最好使用这样的内置JS Array.join
方法
<span>{{ list.join(', ') }}</span>
答案 7 :(得分:1)
如果您确实想要控制 dom 的外观(例如,实际上想要实现您询问的 dom 结构),您可以像这样创建一个 functional component:
<script>
// RenderList.vue
export default {
functional: true,
render(createElement, context) {
// Read the list of entries by accessing the prop "list"
const listEntries = context.props.list;
// Return a custom list of elements for each list entry.
// Only return a `,` if it's not the last entry.
return listEntries.map((listElement, idx) => {
return [
createElement("span", listElement),
idx < listEntries.length - 1 ? ", " : "",
];
});
},
};
</script>
你会像这样使用这个组件:
<template>
<RenderList :list="['alice', 'bob', 'chuck']" />
</template>
答案 8 :(得分:0)
我的组件:
words(a) freq
day 4
week 0
month 0
words(b) freq
breath 1
motion 1
答案 9 :(得分:0)
只需添加另一个我更喜欢使用的替代方法:
<span v-for="(item, index) in list">
{{ item }}{{ (index+1 < list.length) ? ', ' : '' }}
</span>
答案 10 :(得分:0)
我可以建议使用i> 0作为支票吗?
我包装了分隔符,以便{{''}}可以用于仅留一个空格,并避免将span视为空。
<span
v-for="(item, i) in list"
:key="i">
<span v-if="i>0">{{ ', ' }}</span>
<span class="text-nowrap">{{ item }}</span>
</span>
或
<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>
答案 11 :(得分:0)
可能的样品
recyclerView
答案 12 :(得分:0)
对于浏览器在调整窗口大小时不将其作为字符串处理,使用:after
或:before
进行逗号分隔并不是一个好主意。
如果我们尝试在每次迭代中使用条件运算符来检查它是第一个元素还是最后一个元素,那么如果我们有大量项目,这将是一项开销。此外,只要我们有变更检测,就将重新评估条件。
要克服这两个问题,我们可以将逗号括在一个单独的元素中,然后使用CSS :last-child
选择器将其隐藏为
<template v-for="item in list">
<span class="item">
{{item}}
<span class="comma">
,
</span>
</span>
</template>
和CSS
.item:last-child .comma {
display: none;
}