在v-for中动态创建html结构

时间:2016-01-11 15:34:10

标签: javascript vue.js

我目前正面临vue.js的问题,我想在v-for循环中动态创建html标签。用例如下:

生成的html应如下所示:

<div class="wrapper">
    <div class="item">1</div>
    <div class="item">2</div>
</div>
<div class="wrapper">
    <div class="item">3</div>
    <div class="item">4</div>
</div>
...

我迭代的数组只包含项元素:

[
    {
         name: 1
    },
    {
         name: 2
    },
    {
         name: 3
    },
    {
         name: 4
    }
]

标准的v-for循环看起来像这样:

<div class="item" v-for="item in items">{{ item.name }}</div>

但显然缺少包装元素。我如何包含它们?我能想到的唯一解决方案是创建一个计算变量并将项嵌套在那里然后迭代嵌套版本。计算变量看起来像这样:

[
    {
         items: [
             {
                  name: 1
             },
             {
                  name: 2
             }
         ]
    },
    {
         items: [
             {
                  name: 3
             },
             {
                  name: 4
             }
         ]
    }
]

但我真的不想这样做,因为它笨重但不是很好。完美的解决方案是在模板中以某种方式组织结构,就像我用php做的那样。 (在适当的时间打开和关闭包装器div的html标签)。

1 个答案:

答案 0 :(得分:2)

以下是基于您的示例的一种解决方案。希望您能够根据自己的需求进行调整。

看起来你正在将你的一系列项目分成两组。我创建了一个filter来做那个分块:

Vue.filter('chunk', function (value, size) {
  return _.chunk(value, size); // using lodash
})

然后我使用该过滤器创建了一个嵌套的v-for循环:

<div v-for="group in items | chunk 2" class="wrapper">
  <div v-for="item in group" class="item">
    {{ item.name }}
  </div>
</div>

外部循环迭代'chunk',内部循环迭代一个块中的每个项目。

这是一个完整的jsfiddle示例。