【问题标题】:Vue.js nested for loop with search filter带有搜索过滤器的 Vue.js 嵌套 for 循环
【发布时间】:2019-11-18 11:04:45
【问题描述】:

我有一个带有嵌套对象的 JSON 对象,我正在对其进行迭代以提取数据。一切正常,但我想添加一个搜索/过滤器实现,以便在嵌套 for 循环的第二级完成搜索。我让它有点工作,但我没有得到任何数据返回。这是一个例子:

https://codesandbox.io/s/vue-template-s9t9o

在 HelloWorld 组件中是搜索/过滤器发生的地方。 如您所见,它在通过 searchFilter 方法后没有输出其余数据。

要使其在没有搜索/过滤器的情况下工作,请在 line #6 上更改以下内容:

来自:<div class="contentSingle" v-for="(c, i) in searchFilter" :key="i">

收件人:<div class="contentSingle" v-for="(c, i) in cont" :key="i">

谁能想到我可以做些什么来完成这项工作?我需要按主数据对象内每个content 内的元素进行过滤。您可以在FauxData/dataContent.js 目录中找到数据对象。

非常感谢。

-S

【问题讨论】:

  • 您应该在问题中发布相关代码,而不是完全依赖外部链接。这里究竟应该过滤什么,主要项目还是子项目?我知道这是应该用于匹配目的的子项目,但仍然存在歧义。如果单个子项匹配,那么应该只显示该子项还是显示整个父项?
  • 注意...如果子项匹配,我希望显示主索引/标签以及特定的标题和内容。

标签: javascript json vue.js search filter


【解决方案1】:

你应该使用方法而不是计算:

  methods: {
    filterValue(content) {
      return content.filter(item => {
        let itemUpper = item.content.toUpperCase();
        let searchUpper = this.search.toUpperCase();
        return itemUpper.indexOf(searchUpper) > -1;
      });
    }
  }

然后在 HTML 代码中:

  <section id="content">
    <input type="text" id="search" name="search" v-model="search" placeholder="Search Content...">
    <div v-for="(cont, index) in content" :key="index" class="contentWrapper">
      <h1>{{ index }}</h1>
      <div class="contentSingle" v-for="(c, i) in filterValue(cont)" :key="i">
        <h3>{{ c.title }}</h3>
        <div v-html="c.content"></div>
      </div>
    </div>
  </section>

更新

如果要隐藏空白部分,则使用计算值:

  computed: {
    filteredData() {
      return Object.keys(this.content).reduce((a, cKey) => {
        const data = this.filterValue(this.content[cKey]);
        if (data.length) {
          a[cKey] = data;
        }
        return a;
      }, {});
    }
  },
  methods: {
    filterValue(content) {
      return content.filter(item => {
        let itemUpper = item.content.toUpperCase();
        let searchUpper = this.search.toUpperCase();
        return itemUpper.indexOf(searchUpper) > -1;
      });
    }
  }

在外部 v-for 中使用 filteredData

  <section id="content">
    <input type="text" id="search" name="search" v-model="search" placeholder="Search Content...">
    <div v-for="(cont, index) in filteredData" :key="index" class="contentWrapper">
      <h1>{{ index }}</h1>
      <div class="contentSingle" v-for="(c, i) in cont" :key="i">
        <h3>{{ c.title }}</h3>
        <div v-html="c.content"></div>
      </div>
    </div>
  </section>

codepen上的演示

【讨论】:

  • 谢谢 ittus。如何隐藏对象上不属于过滤结果的根/父元素?例如,在您的代码中,如果您使用Four Two 进行过滤,您将获得最后一个标题-内容组合及其根/父“主要四个”。但是您仍然可以看到其他根/父母...我们如何隐藏这些?该方法是否必须在第一个for 循环中执行?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-07
  • 1970-01-01
  • 1970-01-01
  • 2021-08-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多