I have offers cards list rendering thru the loop. Every 3rd col (bootstrap) elements i add row div. Now i need to add another col element (banner block) for every 6th element. For render some thing like that:
How i can implement that?
My code now
JavaScript
x
7
1
<div class="row" v-for="i in Math.ceil(offers.length / 3)">
2
<div class="col-xl-4 col-lg-4 col-md-6 col-sm-12 col-12" v-for="offer in offers.slice((i-1)*3, i*3)">
3
<h2>{{offer.name}}</h2>
4
<h2>{{offer.desc}}</h2>
5
</div>
6
</div>
7
Advertisement
Answer
I would recommend you do less programming in the view and more in the view model. Create a computed
that splits up your data into series of offers and banners, and also into rows, then use that computed in a straightforward way.
JavaScript
1
58
58
1
const chunk = (arr, size) =>
2
arr
3
.reduce((acc, _, i) =>
4
(i % size) ?
5
acc :
6
[acc, arr.slice(i, i + size)], []);
7
8
new Vue({
9
el: '#app',
10
data: {
11
offers: []
12
},
13
computed: {
14
rows() {
15
const withBanners = chunk(this.offers, 5).map((arr) => [arr, {name: 'banner', type: 'Banner'}]).reduce((a, b) => a.concat(b), []);
16
17
return chunk(withBanners, 3);
18
}
19
},
20
mounted() {
21
setTimeout(() => {
22
this.offers = [{
23
name: 'offer'
24
},
25
{
26
name: 'offer'
27
},
28
{
29
name: 'offer'
30
},
31
{
32
name: 'offer'
33
},
34
{
35
name: 'offer'
36
},
37
{
38
name: 'offer'
39
},
40
{
41
name: 'offer'
42
},
43
{
44
name: 'offer'
45
},
46
{
47
name: 'offer'
48
},
49
{
50
name: 'offer'
51
},
52
{
53
name: 'offer'
54
}
55
];
56
}, 500);
57
}
58
});
JavaScript
1
23
23
1
#app {
2
display: grid;
3
}
4
5
.row {
6
display: grid;
7
grid-gap: 2rem;
8
grid-template-columns: repeat(3, auto);
9
justify-content: left;
10
}
11
12
.box {
13
width: 8rem;
14
height: 8rem;
15
}
16
17
.banner {
18
background-color: #f9c;
19
}
20
21
.offer {
22
background-color: #99f;
23
}
JavaScript
1
13
13
1
<script src="https://unpkg.com/vue@latest/dist/vue.js"></script>
2
<div id="app">
3
<div class="row" v-for="row in rows">
4
<div class="col-xl-4 col-lg-4 col-md-6 col-sm-12 col-12" v-for="item in row">
5
<div v-if="item.type === 'Banner'" class="banner box">
6
<h2>{{item.name}}</h2>
7
</div>
8
<div v-else class="offer box">
9
<h2>{{item.name}}</h2>
10
</div>
11
</div>
12
</div>
13
</div>