【问题标题】:Change Computed Property on Click单击时更改计算属性
【发布时间】:2020-08-08 13:15:46
【问题描述】:

是否可以通过点击事件在“v-for”中添加/更改计算属性? 当我点击正确的按钮时,我希望能够根据它们的类别显示食物列表。

如果我点击“水果”按钮,它将是

 <div v-for="food in fruitCategory" :key="food.name" class="card">
      <p>{{ food.name }}</p>
    </div>

还有“糖果”按钮

 <div v-for="food in candyCategory" :key="food.name" class="card">
      <p>{{ food.name }}</p>
    </div>

这是一个好方法吗?

下面的实际代码

<template>
  <div class="layout">
    <button>all</button>
    <button>fruit</button>
    <button>candy</button>
    <div v-for="food in foods" :key="food.name" class="card">
      <p>{{ food.name }}</p>
    </div>
  </div>
</template>
export default {
  name: 'Food',
  data() {
    return {
      foods: [
        { name: 'banana', category: 'fruit' },
        { name: 'orange', category: 'fruit' },
        { name: 'strawberry', category: 'fruit' },
        { name: 'gum', category: 'candy' },
        { name: 'fuzzy peach', category: 'candy' },
      ]
    }
  },
  computed: {
    fruitCategory: function() {
      return this.foods.filter(function(food) {
        return food.category === 'fruit'
      })
    }
  },
  candyCategory: function() {
    return this.foods.filter(function(food) {
      return food.category === 'candy'
    })
  }
}

【问题讨论】:

  • 我倾向于只使用一个带有return food.category === this.category 的计算属性,其中this.category 将是通过单击按钮设置的data 属性。这样的东西符合您的要求吗?

标签: arrays vue.js v-for computed-properties


【解决方案1】:

您只需要将类别存储在data 中,然后您就可以动态使用过滤器。

这里是一个使用 cat 数组检查是否包含类别的工作示例。

new Vue({
  el: "#app",
  name: 'Food',
  data() {
    return {
      cat: ['fruit','candy'],
      foods: [
        { name: 'banana', category: 'fruit' },
        { name: 'orange', category: 'fruit' },
        { name: 'strawberry', category: 'fruit' },
        { name: 'gum', category: 'candy' },
        { name: 'fuzzy peach', category: 'candy' },
      ]
    }
  },
  computed: {
    filtered: function() {
      var cat = this.cat;
      return this.foods.filter(function(food) {
        return cat.indexOf(food.category) >= 0;
      })
    }
  },
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.min.js"></script>


<div id="app">
  <div class="layout">
    <button @click="cat=['fruit', 'candy']">all</button>
    <button @click="cat=['fruit']">fruit</button>
    <button @click="cat=['candy']">candy</button>
    <div v-for="food in filtered" :key="food.name" class="card">
      <p>{{ food.name }}</p>
    </div>
  </div>
</div>

【讨论】:

    猜你喜欢
    • 2012-12-28
    • 2019-06-06
    • 1970-01-01
    • 2017-05-12
    • 2014-04-06
    • 2019-06-03
    • 2019-11-09
    • 2018-05-22
    • 2020-09-09
    相关资源
    最近更新 更多