html - vuejs 中的 v-for 动态图像网格逻辑

标签 html vuejs2 v-for

所以我不断地勾勒出算法来看看它是如何工作的。我的头不断敲击键盘,因为坦白说,似乎没有任何作用。基本上硬编码的 HTML 看起来像这样:

    <div class="row"> 
        <div class="column">
            <a href="products.html#drinks"><div id="drinks">
                <h2>Drinks</h2>
            </div></a>
        </div>
        <div class="column">
            <a href="products.html#preppedfood"><div id="preppedfood">
                <h2>Prepped Food</h2>
            </div></a>
        </div>
        <div class="column">
            <a href="products.html#coffee"><div id="coffee">
                <h2>Coffee Machines</h2>
            </div></a>
        </div>
        <div class="column">
            <a href="products.html#snacks"><div id="snacks">
                <h2>Snacks</h2>
            </div></a>
        </div>
    </div>
    <div class="row"> 
        <div class="column">
            <a href="products.html#nuts"><div id="nuts">
                <h2>Nuts of All Kinds</h2>
            </div></a>
        </div>...till the last div class="row" and it's column divs

所以 HTML 工作正常,这是一个屏幕截图: This is how I want it to look!

但是使用 VueJS 以便我可以“干燥”我的标记,我在 Prods.vue 组件中使用 v-for 指令。这是模板标记:

   <div class="row" v-for="(data, index) in images" v-bind:key="data" v-if="data.ImageId%4 == 0">
  <h1>{{index}}</h1>
  <div 
    class="column" 
    v-for="data in images" 
    v-bind:key="data" 
    v-if="computedIndex(index) *4 >= index && index < (computedIndex(index)+1) / 4"
    v-lazy-container="{ selector: 'data' }"
  >  
    <a :href="'products/#'+data.Name">
      <h4>{{data.H2}}</h4>
      <img :src="'../../../static/products/'+data.Name+'.png'" :alt="data.Name+'.png'" />
    </a>
  </div>
</div>

脚本:

    <script>
  import Prods from '../../../other/jsons/products.json'
  import VueLazyload from 'vue-lazyload'
  export default {
    data() {
      return {images: Prods}
    },
    methods: {
      computedIndex(index) {
        return Math.trunc(index/4)
      }
    }
  }
  //v-for in row
  //v-for in column
</script>

这就是显示的内容: enter image description here

最佳答案

对我来说,计算数组的形状以适合您的 DOM 似乎更直接,而不是使用索引:

computed:
  imageRows () {
    return this.images.reduce((acc, n, i) => {
      i % 4 ? acc[acc.length - 1].push(n) : acc.push([n])
      return acc
    }, [])
  }

像这样使用:

<table>
  <tr v-for="(imageRow, i) in imageRows" :key="i">
    <td v-for="image in imageRow" :key="image">
      <foo/>
    </td>
  </tr>
</table>

(您的数据对我来说似乎是表格形式的,因此我将此示例显示为 <table> ,但当然,如果您愿意,可以将其替换为 <div> 。)

关于html - vuejs 中的 v-for 动态图像网格逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50184040/

相关文章:

javascript - 屏幕中央的 jQuery 和 CSS 定位元素

javascript - 让 google-chrome 浏览器在页面加载时全屏显示

javascript - Vue 使用 getJSON 选择

vue.js - 更改特定索引而不在 Vuejs 中重新渲染整个数组

vue.js:反转 v-for 循环的顺序

javascript - 屏幕左侧的白色垂直线

javascript - 在 IE 11 中循环一段代码

javascript - 在 Vuetify 数据表中仅显示悬停的 <v-icon>

javascript - 调用方法时页面刷新(不需要)

html - IE 7 偏移量随着 child 的增加而增加