javascript - 在 Vue 模板中按类别组循环遍历产品项

标签 javascript arrays vue.js vuejs2 vue-component

我想按类别呈现产品。到目前为止,我可以使用 v-for 渲染产品,但我希望根据类别渲染类似的产品。

我在使用 webpack 和 Vuex 时通过 DRF 从 Django 获取数据。我知道我无法使用 v-ifv-for,所以请告诉我如何在从 filteredCategorys 获取类别的同时呈现产品。我是一个新学习者,如果我不清楚这个问题,很抱歉。

<base-card-food>
  <div v-if="isLoading">
    <base-spinner></base-spinner>
  </div>
  <ul v-else-if="hasFoods">
    <food-item
      v-for="food in filteredFoods"
      :key="food.id"
      :id="food.id"
      :name="food.name"
      :category="food.category"
      :description="food.description"
      :base_price="food.base_price"
      :photo="food.photo"
    ></food-item>
    <ul>
      <li v-for="cat in filteredCategorys" :key="cat.id">
        {{ cat.id }}
        {{ cat.name }}  
      </li>
    </ul>      
  </ul>
  <h3 v-else>No foods found.</h3>
</base-card-food>
computed: {
  filteredCategorys() {
    const categorys = this.$store.getters['categorys/categorys'];
    return categorys;
  },

  filteredFoods() {
    const foods = this.$store.getters['foods/foods'];
    return foods;
  }
}

最佳答案

使用计算将项目数组重新排列到一个对象中,该对象的键是类别名称。每个键对应的值将是该类别的项目的数组。一般情况如下(稍后会有针对您的数据的特定演示):

computed: {
  grouped() {
    const groups = {};
    this.items.forEach(item => {
      groups[item.category] = groups[item.category] || [];
      groups[item.category].push(item);
    })
    return groups;
  }
}

对类别使用外循环,对类别项使用内循环:

<div v-for="category in categories" :key="category.id">
  Category: {{ category.name }}
  <div v-for="item in grouped[category.name]" :key="item.id">
    Item: {{ item }}
  </div>
</div>

这是一个演示:

new Vue({
  el: "#app",
  data() {
    return {
      categories: [
        { id: 1, name: 'a' },
        { id: 2, name: 'b' },
        { id: 3, name: 'c' },
      ],
      items: [
        { id: 1, category: 'c', name: 'c1' },
        { id: 2, category: 'b', name: 'b1' },
        { id: 3, category: 'c', name: 'c2' },
        { id: 4, category: 'a', name: 'a1' },
        { id: 5, category: 'a', name: 'a2' },
        { id: 6, category: 'c', name: 'c3' },
        { id: 7, category: 'a', name: 'a3' },
        { id: 8, category: 'b', name: 'b2' },
      ]
    }
  },
  computed: {
    filteredFoods() {
      return this.items;  // mockup
    },
    filteredCategorys() {
      return this.categories;  // mockup
    },
    grouped() {
      const groups = {};
      this.filteredFoods.forEach(item => {
        groups[item.category] = groups[item.category] || [];
        groups[item.category].push(item);
      })
      return groups;
    }
  }
});
<div id="app">
  <div v-for="category in filteredCategorys" :key="category.id">
    Category: {{ category.name }}
    <div v-for="item in grouped[category.name]" :key="item.id">
      Item: {{ item }}
    </div>
  </div>
</div>

<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>

由于您的数据来自 Vuex,因此您可以创建 grouped 作为 getter 而不是计算。然后你只需要导入该 getter。

关于javascript - 在 Vue 模板中按类别组循环遍历产品项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66289581/

相关文章:

java - 从一维数组中删除行

javascript - Failcallback 中断多个 then

javascript - 为 eclipse 启用 javascript 验证

javascript - HTML-CSS 选项的背景颜色

arrays - 使用 postgresql 中的其他列更新数组类型的列

javascript - 当我在 Vue 中单击路由页面关于时,数据正在清除

javascript - 无法访问异步函数外部的变量

javascript - 如何从javascript中的字符串中提取数字数组

webpack - 我如何更改VUE中的主文件夹

javascript - 如何为 vue 声明一个 JS mixin?