【问题标题】:Dynamically create a html structure in v-for在 v-for 中动态创建一个 html 结构
【发布时间】:2023-04-03 22:48:01
【问题描述】:

我目前面临一个 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>
...

我正在迭代的数组只包含 item 元素:

[
    {
         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标签)。

【问题讨论】:

    标签: javascript vue.js


    【解决方案1】:

    这是基于您的示例的一种解决方案。希望您可以对其进行调整以满足您的需求。

    看起来您正在将一组项目分成两组。我创建了一个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>
    

    外部循环迭代“块”,内部循环迭代块中的每个项目。

    这是一个完整的 jsfiddle 示例。

    【讨论】:

    • 谢谢,这是一个简单的解决方案,但基本上它只是创建了我在问题中作为示例添加的最后一个代码块。最初,我不想那样做,主要是因为它不是很灵活,不能很容易地适应类似的问题。不过还是谢谢,因为我想在这种情况下我会选择你的解决方案。
    • 试过你的小提琴,但它不起作用。这仍然适用于 vue2 吗?
    • 对不起,我已经更新了 jsfiddle。此解决方案仅适用于 Vue 1.x;我不认为过滤器可以在 Vue 2.x 中的许多地方使用。您也许可以使用 Vue 2 中的计算属性实现类似的功能。
    猜你喜欢
    • 1970-01-01
    • 2021-04-07
    • 1970-01-01
    • 2018-01-25
    • 1970-01-01
    • 2016-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多