【问题标题】:How can I add button to filter some data?如何添加按钮来过滤某些数据?
【发布时间】:2021-06-27 16:15:17
【问题描述】:

我使用的是 Vue.js 3.0 版本,这是我的代码

<script>
export default {
  data: function () {
    return {
      movies: [
        {
          id: 1,
          title: "They All Lie",
          releaseYear: 1989,
          director: {
            id: 18,
            firstName: "Darci",
            lastName: "Overill",
            nationality: "China",
            birthdate: "07/13/1973",
          },
        },
        {
          id: 2,
          title: "Star Wars",
          releaseYear: 1997,
          director: {
            id: 18,
            title:'john',
            firstName: "Darci",
            lastName: "Overill",
            nationality: "China",
            birthdate: "07/13/1973",
          },
        },
        {
          id: 3,
          title: "Mamma mia",
          releaseYear: 2005,
          director: {
            id: 19,
            title:'vesko',
            firstName: "John",
            lastName: "Smith",
            nationality: "USA",
            birthdate: "07/13/1980",
          },
        },
      ],
    };
  },
  computed: {
    filteredMovies() {
      return this.movies.filter((el) => el.director.title === 'vesko' );
    },
  },
};
</script>
<template>
  <div>
    <div class="row">
      <div class="col"><h1 class="mt-3">List of all Movies</h1></div>
    </div>
    <table class="table">
      <thead>
        <tr>
          <th>Movie ID</th>
          <th>Title</th>
          <th>Release Year</th>
          <th>Director ID</th>
          <th></th>
        </tr>
      </thead>
      <tbody>
        <tr v-for="movie in filteredMovies" :key="movie.id">
          <td>{{ movie.id }}</td>
          <td>{{ movie.title }}</td>
          <td>{{ movie.releaseYear }}</td>
          <td>{{ movie.director.id }}</td>
        </tr>
      </tbody>
    </table>
  </div>
</template>

所以我想在单击时添加一些按钮,我想过滤我的数据。例如,当我单击时名称为 John 的复选框或按钮我只想显示带有导演标题 John 的数据或当有人输入值 John 时的输入字段 我只想要带有标题值 John 的数据。我是 Vue.js 的新手,所以我需要一些帮助

【问题讨论】:

  • 我会使用 vuex 并将一个函数附加到您的复选框以重新查询 vuex 并应用您的过滤器。
  • @JeffB 你能在这里放一些代码,向我解释一下具体怎么做吗?
  • 你以前用过vuex吗?最好的资源是首先学习如何添加它(非常简单,看这里:vuex.vuejs.org)。添加 vuex 后,我可以帮助您编写访问数据所需的函数。
  • 我之前没用过。实际上,我想从 API 请求中过滤一些数据,但我想在这里对这些虚拟数据进行练习。所以你建议我学习 Vuex?
  • 有时您会使用 vuex 存储数据,也不会使用。如果您希望这些数据在多个页面中持久存在,vuex 是您的最佳选择。无论哪种方式,学习vuex!如果此数据不是持久的,那么您可以将过滤器应用到您列出的数据中。这个答案可能会有所帮助:stackoverflow.com/a/41791604/2096053

标签: javascript html vue.js filter vue-component


【解决方案1】:

如果您不使用 Vuex,我可能会使用 v-model 来启用/禁用您想要过滤的某些关键字,然后更新您的 filteredMovies 计算函数以返回所选电影。

Demo

<template>
<div>
   <form>
      <input type="checkbox" name="drama" v-model="filters.drama"/>
      <label for="drama">Drama</label>
      
      <input type="checkbox" name="comedy" v-model="filters.comedy"/>
      <label for="comedy">Comedy</label>
      
      <input type="checkbox" name="horror" v-model="filters.horror"/>
      <label for="horror">Horror</label>
   </form>

   <div v-for="(movie, index) in filteredMovies" :key="movie.title + index">
      <div>
        {{ movie.title }}
      </div>
   </div>
</div>
</template>

<script>
  export default {
    data: ()=>({
      filters: {
        drama: true,
        comedy: true,
        horror: true,
      },
      movies: [
        { title: 'Movia A', genres: ['drama', 'comedy']},
        { title: 'Movia B', genres: ['horror', 'comedy']},
      ]
    }),
    computed: {
      filteredMovies(){
        return this.movies.filter( movie => {
          // create an array of the selected genres from this.filter
          let selectedGenres = Object.keys(this.filters).filter(item => this.filters[item] === true)
          // if this movie includes any of the selected genres, then keep it
                    return movie.genres.some(item => selectedGenres.includes(item))
        })
      }
    }
  }
</script>

不确定您的最终目标是什么,但您也可以对文本输入字段执行相同操作。

【讨论】:

  • 最终目标是显示一些来自获取 API 请求的数据,并过滤这些数据并抛出一些复选框和输入字段。您是否建议我将 Vuex 用于您提出的那个或这个示例?这很好用,所以我认为这可以很好地帮助我
  • @Vesko_dev 这个答案非常适合您计划不保留的数据。如果这些数据需要跨越多个页面,请将其保存在 vuex 之类的数据存储中。
  • @Vesko_dev 如果您正在制作一个较小的应用程序,那么在我看来,使用计算函数是完全可以的。如果您想在各个组件之间共享过滤后的数据,那么您肯定会想要研究 vuex。
  • 实际上,我有一些网站,我想用 Vue+Ionic 制作一些移动应用程序,客户可以在其中看到对象列表并放置一些过滤器,如特定城市、特定价格,如果你懂我
  • @Vesko_dev 听起来您将要从 API 中提取信息,这些信息应该会持续存在。绝对使用 vuex。您不想一遍又一遍地查询 API 来获取半静态/静态的数据。换句话说 - 它不会经常改变。
猜你喜欢
  • 2021-04-24
  • 2013-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-13
  • 1970-01-01
  • 2022-08-19
相关资源
最近更新 更多