V-if inside v-for - display list of items in two columns
What I would do is create a computed property dividing (or chunking) the items array into the appropriate number of columns.
Here's an example that uses a flexbox layout and one extra column element.
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/[email protected]/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>
If you'd like a less verbose way of chunking the items array, see Split array into chunks
Its good to see someone who stumbled across the same problem as me. I had to position 6 items in each column. I sliced the API-response into the columns and printed them afterwards.
let allCategory = response.body.Categories.slice(); //clone
while (allCategory.length > 0) {
let chunk = allCategory.splice(0,6);
this.ColArray.push(chunk);
}
ColArray is an array that then will contain arrays of the columns. It would look like this:
{
ColArray: [
Column1: [
Item1,
Item2,
Item3,
],
Column2: [
...
]
]
}
In Vue it will just be looped through, like this:
<div v-for="(col,colIndex) in ColArray" :key="'cate_col'+colIndex" class="col-md-2">
<div v-for="(row,rowIndex ) in col" :key="'cate_row'+colIndex + rowIndex" class="row">
{{row}}
</div>
</div>
Here is a sample fiddle :
https://jsfiddle.net/keysl183/50wL7mdz/775484/