【问题标题】:VueJs - Conditional statement / filter on v-for resultsVueJs - v-for 结果的条件语句/过滤器
【发布时间】:2020-08-06 11:32:16
【问题描述】:

所以现在我这样做是为了按类别组织我的结果,但如果觉得这样可能会更好:

<div><h2>Gloves</h2></div>
<div v-for="stash in stashes" :key="stash.id">
  <div v-for="item in stash.items" :key="item.id">
    <div v-if="item.extended.subcategories[0] === 'gloves'">
      {{ item.extended.baseType }}
    </div>
  </div>
</div>
<div><h2>Boots</h2></div>
<div v-for="stash in stashes" :key="stash.id2">
  <div v-for="item in stash.items" :key="item.id2">
    <div v-if="item.extended.subcategories[0] === 'belt'">
      {{ item.extended.baseType }}
    </div>
  </div>
</div>
<div><h2>Helmets</h2></div>
..
<div><h2>Weapons</h2></div>
..

如果发现 this 文章使用计算属性执行此操作,我觉得这应该是方法,但无法使其工作(也是因为我需要一个参数才能让它以这种方式工作?):

  computed: {
    filter(category) {
      return this.stashes.items.filter(a => a.extended.subcategories[0] === category);
    }
  }

然后是这样的:

<div v-for="item in filter('gloves')" :key="item.id">
 ..
</div>

但是,是的,它说我不能像这样在 for 循环中传递参数,所以我现在就这样结束了。

有人知道怎么做吗?

存储看起来像这样:

stashes: [
  {
    id: 1
    items: [{
      name: 'lorem',
      extended: {
        subcategories: ["gloves"]
      }
    }]
  },
  {
    id: 2
    items: [{
      name: 'ipsum',
      extended: {
        subcategories: ["boots"]
      }
    }]
  },
]

【问题讨论】:

    标签: javascript vue.js conditional-statements v-for computed-properties


    【解决方案1】:

    虽然在模板中使用方法可能会解决这个问题,但这不是一个好的模式,因为它会导致每次模板因任何原因重新呈现时都会运行该方法。添加另一个级别的v-for

    <div v-for="category in categories" :key="category">
      <div><h2>{{ category }}</h2></div>
      <div v-for="stash in stashes" :key="stash.id">
        <div v-for="item in stash.items" :key="item.id">
          <div v-if="item.extended.subcategories[0] === category">
            {{ item.extended.baseType }}
          </div>
        </div>
      </div>
    </div>
    

    并创建一个类别数组,例如:

    data() {
       return {
          categories: ['gloves','belt']
       }
    }
    

    【讨论】:

    • 这很有意义谢谢丹!必须说,有时只是为了发现解决方案就是这么简单而苦苦挣扎,这有点令人沮丧。
    • 不客气。没关系,一旦你看到并使用它们,你可能会更加熟悉它们
    • 这是一个数据结构的想法,它不会强迫您遍历每个类别的每个项目。就像现在一样,如果有很多类别和很多项目,它可能会变得很慢。这种方式只循环已知在当前类别迭代中的项目:jsfiddle.net/sh0ber/93xrmq2h 检查stashes 结构
    • 很棒的丹!存储数据现在来自 API。在我使用它之前重组它是我应该考虑的事情吗?这是相当多的数据。
    • 如果只需要做一次(因为原始数据没有改变),我会说是的。但也许您可以等待,看看性能是否会成为问题,因为这是这样做的唯一原因。在这种情况下,重组一次以节省模板中的大量额外循环是值得的。
    【解决方案2】:

    您可以通过从计算中返回一个方法来实现此目的,但我不推荐此解决方案。我建议您使用方法,而不是计算。

    [推荐]

    method: {
        filter(category) {
          return this.stashes.items.filter(a => a.extended.subcategories[0] === category);
        }
      }
    

    [使用计算]

    computed: {
        filter() {
          return category => this.stashes.items.filter(a => a.extended.subcategories[0] === category);
        }
      }
    

    您可以在这里阅读更多相关信息:Why I can not pass parameter to the computed

    【讨论】:

    • 感谢 Krzysztof,虽然 Dan 的 aprouch 似乎是要走的路……我会阅读你链接的线程!
    猜你喜欢
    • 2021-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-27
    相关资源
    最近更新 更多