v-for render or don't render <div> on {x} iteration
v-for render or dont render <div> on {x} iteration
我没有在任何地方找到我的问题的解决方案,我无法弄清楚。我有 div 个这样的
<div class="columns">
<div class="column">
{looping content here}
</div>
</div
数据是这样的:
{
title: 'blabla'
body: 'blabla'
msg: 'blabla"
}
出于响应目的,我最多需要并排放置 3 列,然后启动另一个列容器,该容器将在下方堆叠列。因此,列容器内有 3 列 div,然后创建另一个列 div,其中包含 3 列 div,直到数组为空。
我已经尝试计算计数 属性 但不知道如何在 v-for 中迭代它。也试过 v-if 但它没有按计划工作:(
在 v-for 中甚至可能吗?老实说,我不知道该采取什么方法。
如果数据格式正确,可以嵌套 v-for
循环。
例如,对象数组(对于第一个v-for
)(对于第二个循环):
new Vue({
el: "#app",
data() {
return {
items: [
{
title: 'Title 1',
body: 'body 1',
msg: 'message 1'
},
{
title: 'Title 2',
body: 'body 2',
msg: 'message 2'
}
]
}
}
})
.columns {
align-items: center;
display: flex;
height: 40px;
justify-content: space-around;
width: 50%;
}
<script src="https://unpkg.com/vue@2.6.8/dist/vue.min.js"></script>
<div id="app">
<div class="columns" v-for="item in items">
<div class="column" v-for="(value, key) in item">
<div>{{ value }}</div>
</div>
</div>
</div>
为什么不直接将每一列插入一个列容器中,然后使用 CSS 每 3 列换行到一个新行。这样做的额外好处是您可以使用媒体查询调整每行中显示的列数。
在全屏模式下尝试运行下面的代码片段,并将浏览器的大小调整到小于 576 像素宽以查看响应列。
new Vue({
el: '#app',
data () {
return {
columns: [
{
title: 'blabla',
body: 'blabla',
msg: 'blabla'
},
{
title: 'blabla',
body: 'blabla',
msg: 'blabla'
},
{
title: 'blabla',
body: 'blabla',
msg: 'blabla'
},
{
title: 'blabla',
body: 'blabla',
msg: 'blabla'
},
{
title: 'blabla',
body: 'blabla',
msg: 'blabla'
}
]
}
}
})
.columns {
display: flex;
flex-wrap: wrap;
}
.column {
box-sizing: border-box;
padding: 1em;
width: 33.3%;
}
/* on devices smaller than 576px, stack columns */
@media (max-width: 576px) {
.column {
width: 100%;
}
}
<script src="https://unpkg.com/vue@2.6.8/dist/vue.min.js"></script>
<div id="app">
<div class="columns">
<div v-for="(column, index) in columns" class="column" :key="index">
<h2>{{ column.title }}</h2>
<p>{{ column.body }}</p>
<strong>{{ column.msg }}</strong>
</div>
</div>
</div>
我没有在任何地方找到我的问题的解决方案,我无法弄清楚。我有 div 个这样的
<div class="columns">
<div class="column">
{looping content here}
</div>
</div
数据是这样的:
{
title: 'blabla'
body: 'blabla'
msg: 'blabla"
}
出于响应目的,我最多需要并排放置 3 列,然后启动另一个列容器,该容器将在下方堆叠列。因此,列容器内有 3 列 div,然后创建另一个列 div,其中包含 3 列 div,直到数组为空。
我已经尝试计算计数 属性 但不知道如何在 v-for 中迭代它。也试过 v-if 但它没有按计划工作:(
在 v-for 中甚至可能吗?老实说,我不知道该采取什么方法。
如果数据格式正确,可以嵌套 v-for
循环。
例如,对象数组(对于第一个v-for
)(对于第二个循环):
new Vue({
el: "#app",
data() {
return {
items: [
{
title: 'Title 1',
body: 'body 1',
msg: 'message 1'
},
{
title: 'Title 2',
body: 'body 2',
msg: 'message 2'
}
]
}
}
})
.columns {
align-items: center;
display: flex;
height: 40px;
justify-content: space-around;
width: 50%;
}
<script src="https://unpkg.com/vue@2.6.8/dist/vue.min.js"></script>
<div id="app">
<div class="columns" v-for="item in items">
<div class="column" v-for="(value, key) in item">
<div>{{ value }}</div>
</div>
</div>
</div>
为什么不直接将每一列插入一个列容器中,然后使用 CSS 每 3 列换行到一个新行。这样做的额外好处是您可以使用媒体查询调整每行中显示的列数。
在全屏模式下尝试运行下面的代码片段,并将浏览器的大小调整到小于 576 像素宽以查看响应列。
new Vue({
el: '#app',
data () {
return {
columns: [
{
title: 'blabla',
body: 'blabla',
msg: 'blabla'
},
{
title: 'blabla',
body: 'blabla',
msg: 'blabla'
},
{
title: 'blabla',
body: 'blabla',
msg: 'blabla'
},
{
title: 'blabla',
body: 'blabla',
msg: 'blabla'
},
{
title: 'blabla',
body: 'blabla',
msg: 'blabla'
}
]
}
}
})
.columns {
display: flex;
flex-wrap: wrap;
}
.column {
box-sizing: border-box;
padding: 1em;
width: 33.3%;
}
/* on devices smaller than 576px, stack columns */
@media (max-width: 576px) {
.column {
width: 100%;
}
}
<script src="https://unpkg.com/vue@2.6.8/dist/vue.min.js"></script>
<div id="app">
<div class="columns">
<div v-for="(column, index) in columns" class="column" :key="index">
<h2>{{ column.title }}</h2>
<p>{{ column.body }}</p>
<strong>{{ column.msg }}</strong>
</div>
</div>
</div>