【问题标题】:Vuejs v-for on inline elements trims whitespace内联元素上的 Vuejs v-for 修剪空格
【发布时间】:2018-01-24 14:47:55
【问题描述】:

在内联元素上使用 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

我该如何应对这种行为?

【问题讨论】:

  • 问题是当你直接迭代锚时,没有空格可以渲染。如果您特别想要呈现空白,则需要将其包含在要呈现的事物中,例如jsfiddle.net/mq4hc614/2。然而,这可能会用 CSS 更好地处理。
  • 这样可以正常工作,谢谢。如果有人阅读本文可能不想要一个不间断的空格(这是我的情况),您必须使用&amp;#32; 明确声明空格

标签: javascript html vue.js v-for


【解决方案1】:

来自List Rendering > v-for on a &lt;template&gt; 上的文档

类似于模板v-if,您也可以使用带有v-for&lt;template&gt; 标签来渲染一个包含多个元素的块。例如:

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

因此,为了获得同级元素(是的,breaking space character &amp;#32; 将算作一个),您必须将循环添加到父 &lt;template&gt; 容器中,然后在像这样循环的内容:

<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>

如果你只想要空格 in-between 元素,你可以有条件地输出空格:

<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

【讨论】:

    【解决方案2】:

    我有一个案例,我需要将字符串的每个字符(包括空格)包装在 &lt;span&gt; 中并以这种方式解决。

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

    【讨论】:

    • 这个解决方案,虽然可能看起来很脏 - 是迄今为止唯一适用于子词单元的解决方案:)
    • 通过用不间断空格替换断行空格,生成的文本行将是不间断的,这通常不是您想要的。
    【解决方案3】:

    你可以使用 CSS:

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

    【讨论】:

    • 没有投反对票,但可能有更多不依赖内联样式的语义解决方法(见上文)。不过,我相信它会为某些人工作
    猜你喜欢
    • 1970-01-01
    • 2019-12-19
    • 2020-08-19
    • 2016-12-21
    • 2019-05-09
    • 2021-07-09
    • 1970-01-01
    • 2017-06-03
    • 2018-09-25
    相关资源
    最近更新 更多