我很抱歉发布这篇文章,因为我可以看到很多类似的问题已经被问了好几次.以下是那些接近于帮助我的人——以及他们为什么没有:

  • This一个原因是,计算不应该在渲染中进行,而应该在"方法/计算"部分进行.这对我没有帮助.
  • This一个是使用两个不同的模板,在模板标签上写v-if.在我的例子中,这似乎是愚蠢的,因为这两个模板将是98%相同的.
  • This篇中等篇幅的文章解决了我身边的一个问题.然而,在他的例子中,这是对用户的过滤(由计算(computed)属性来解决),而不是在某个迭代中插入代码片段的if子句(我想这就是我要寻找的).

The problem

我有一个从API中提取的项目列表,所以数量会发生变化.我希望它们显示在两列中:

-----------------
| Item1   Item5 |
| Item2   Item6 |
| Item3   Item7 |
| Item4         |
-----------------

我用一个v-for的循环遍历它们.

My attempts

  1. Using pure CSS with 100

但这只能做到这一点:

-----------------
| Item1   Item2 |
| Item3   Item4 |
| Item5   Item6 |
| Item7         |
-----------------
  1. Using CSS with 100

但那断列中的元素,就display: block; overflow: hidden;和许多其他try 而言.应该说,这些元素的高度可能会有所不同.

  1. So I gave up on fixing it using CSS.

如果它是php,那么我只会这样做:

<?php
if( $index == count( $items)/2 ):
  echo '</div>';
  echo '</div>';
  echo '<div class="col-md-6">';
  echo '<div class="item-container">';
endif;
?>

... 但事实并非如此.我正在寻找vue的替代品.我试了this次:

{{#if key === Number( items.length / 2 ) }}
  </div>
  </div>
  <div class="col-md-6">
  <div class="item-container">
{{/if}

但它不起作用.据我所知,这不是"vue方式".但我不知道是什么-/

有这样的东西吗?

A simplification of my current code

<div class="col-md-12">
    <div class="items-container">
        <div class="item-container" v-for="item, key in items['data']">
            <!-- A BUNCH OF ITEM-INFO -->
        </div><!-- /.item-container -->
    </div><!-- /.items-container -->
</div><!-- /.col-md-12 -->

推荐答案

我要做的是创建一个计算(computed)属性,将items数组分割(或分块)为适当数量的列.

下面是一个使用flexbox布局和一个额外的column元素的示例.

new Vue({
  el: 'main',
  data: {
    items: ['Item 1', 'Item 2', 'Item 3', 'Item 4', 'Item 5', 'Item 6', 'Item 7'],
    cols: 2
  },
  computed: {
    columns () {
      let columns = []
      let mid = Math.ceil(this.items.length / this.cols)
      for (let col = 0; col < this.cols; col++) {
        columns.push(this.items.slice(col * mid, col * mid + mid))
      }
      return columns
    }
  }
})
.container {
  display: flex;
  border: 1px solid;
}
.col {
  margin: 10px;
  border: 1px solid;
  flex-grow: 1;
  display: flex;
  flex-direction: column;
}
.item-container {
  border: 1px solid;
  padding: 5px;
  margin: 5px;
}
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.min.js"></script>
<main>
<p><label>Columns:<label> <input type="number" v-model="cols"></p>
<div class="container">
  <div class="col" v-for="column in columns">
    <div class="item-container" v-for="item in column">{{item}}</div>
  </div>
</div>
</main>

如果你想用一种不那么冗长的方式对items数组进行分块,请参见Split array into chunks

Vue.js相关问答推荐

设置Vite Vue 3需要多个应用程序输出目录

如何将模板传递给EJS菜单

v-model 修饰符返回空

Vuetify 复选框未正确显示值

NUXT 3 在客户端获取数据

在 Vue 中更改 json 数据后,如何在屏幕上重新呈现表格组件?

如何 for each 动态创建的按钮/文本字段设置唯一变量?

vue 计算的 ant watch 不会在嵌套属性更改时触发

如何容器化 Vue.js 应用程序?

为什么在 Vue.js 中使用 `var` 关键字?

Vue.js 中有没有类似Jquery $(document).ready的功能?

vuejs 中的单元测试

如何使用 laravel-mix 将 bootstrap-vue 加载到 Laravel 5 中?

如何告诉 Vue 应用使用 Firebase 模拟器?

我可以在 Vue 实例方法中传播的 mapMutations 中使用this吗?

如何禁用 nuxt 默认错误重定向

如何在 Vue 中动态创建组件上获取更新的 $refs?

Vue 3 组合 API,如何在 setup() 函数中获取上下文父属性?

无法访问手表处理程序 vuejs 中的数据变量

Vue.js 中的条件 依赖于props值?