内联元素上的Vuejs v-for修剪空格

时间:2018-01-24 14:47:56

标签: javascript html vue.js v-for

当在内联元素上使用v-for循环数组(或对象)时,vuejs不会在所述元素周围呈现空白。

例如,我有这个html:

<div id="app">
    Vue Rendering<br>
    <a v-for="fruit in fruits" v-bind:href="fruit.url" v-html="fruit.label"></a>

    </div>
    <div>
    Navite rendering<br>
    <a href="apple.html">Apple</a>
    <a href="banana.html">Banana</a>
    <a href="peach.html">Peach</a>
</div>

和这个javascript:

var fruits = [
    {
        label: 'Apple',
        url: 'apple.html'
    },
    {
        label: 'Banana',
        url: 'banana.html'
    },
    {
        label: 'Peach',
        url: 'peach.html'
    }
];

var app = new Vue({
    el: '#app',
    data: {
        fruits: fruits
    }
});

当Vue渲染时,它会删除链接之间的空格。请参阅this jsfiddle

我该如何反击这种行为?

3 个答案:

答案 0 :(得分:3)

来自List Rendering > v-for on a <template>上的文档

  

类似于模板v-if,您还可以将<template>标记与v-for一起使用,以呈现多个元素的块。例如:

     
<ul>
  <template v-for="item in items">
    <li>{{ item.msg }}</li>
    <li class="divider" role="presentation"></li>
  </template>
</ul>

因此,为了获得同级元素(是的,breaking space character &#32;将被视为一个),您必须将循环添加到父<template>容器中,然后包含任何元素/间距您想要这样的循环内容:

<template v-for="fruit in fruits" >
  <span>{{fruit}}</span>&#32;
</template>

从Vue 2.x +开始,模板会修剪所有换行符,即使它们已被转义。

相反,您可以像这样添加广告位或文本插值:

<template v-for="fruit in fruits" >
  <span>{{fruit}}</span><slot> </slot>
</template>
<template v-for="fruit in fruits" >
  <span>{{fruit}}</span>{{ ' ' }}
</template>

如果只希望元素之间存在空格 ,则可以有条件地输出空格:

<template v-for="(fruit, i) in fruits" >
  <span>{{fruit}}</span>{{ i < fruits.length -1 ? ', ': '' }}
</template>

堆栈摘要中的演示

var app = new Vue({
    el: '#app',
    data: {
        fruits: ["apple", "banana", "carrot"]
    }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.0.0/vue.js"></script>

<div id="app">
    <template v-for="(fruit, i) in fruits" >
      <span>{{fruit}}</span>{{ i < fruits.length -1 ? ', ': '' }}
    </template>
</div>

进一步阅读
Issue #1841 - Suggestion: v-glue / v-for element joins

答案 1 :(得分:0)

您可以使用CSS:

<a v-for="fruit in fruits" v-bind:href="fruit.url" v-html="fruit.label" 
   style="margin-right: 5px;"></a>

答案 2 :(得分:0)

我想将字符串的每个字符都包装在<span>中,并以此方式解决。

<template v-for="(letter, i) in 'My text with spaces'">
    <span v-if="letter !== ' '">{{ letter }}</span>
    <span v-else>&nbsp;</span>
</template>