搜索和过滤器功能仍然无法正常使用(Vue JS)

法兰克福

我正在弄清楚我的搜索和过滤功能如何正常工作。我通过创建从搜索结果的搜索功能和过滤器stockdistanceprice,和time response我的搜索功能运行良好。但是,我制作的过滤器功能仍然无法使用。

我想在搜索后想要进一步过滤搜索,当其中一个下拉菜单更改时,会有诸如股票和距离之类的选项,搜索结果项也会根据过滤器而变化(例如:股票)是否可用。还有其他过滤器,例如价格和时间响应。当我单击价格时,将按照最低价格到最高价格对项目进行排序。当我单击时间响应时,搜索项将按从快速响应到延迟响应的顺序排列。

示例案例

Type,我选择BMW然后,我单击搜索按钮。将显示2个类型为的项目结果BMW然后,在筛选器中,Distance我选择500 KM它应该只显示1个结果。但是过滤器不起作用。

如果有6个项目结果,并且我单击price该项目,则将按从最低价格到最高价格的顺序进行排序

我已经编写了如下代码,有人可以帮助我解决此问题吗?

new Vue({
  el: '#app',
  data: {
    selectedType: '',
    selectedCountry: '',
    selectedYear: '',
    selectedStock:'',
    selectedDistance:'',
    items: [{
        name: 'Carthy',
        type: 'mercedes',
        year: '2020',
        country: 'england',
        stock: 'available',
        distance: '500',
        price: '1900',
        response: 'fast'
      },
            {
        name: 'Holand',
        type: 'mercedes',
        year: '2020',
        country: 'england',
        stock: 'available',
        distance: '500',
        price: '1050',
        response: 'fast'
      },
      {
        name: 'Nolan',
        type: 'mercedes',
        year: '2020',
        country: 'england',
        stock: 'available',
        distance: '500',
        price: '1000',
        response: 'fast'
      },
      {
        name: 'Edgar',
        type: 'bmw',
        year: '2020',
        country: 'belgium',
        stock: 'available',
        distance: '5000',
        price: '1200',
        response: 'fast'
      },
      {
        name: 'John',
        type: 'bmw',
        year: '2019',
        country: 'england',
        stock: 'available',
        distance: '500',
        price: '1500',
        response: 'fast'
      },
      {
        name: 'Axel',
        type: 'mercedes',
        year: '2020',
        country: 'england',
        stock: 'sold',
        distance: '500',
        price: '1600',
        response: 'late'
      }
    ],
    searchResult: [],
    itemsToShow: 2,
    totalItems: 0,
    sortByPrice: true,
    sort: 'price',
    sortByTime: true,
    sort: 'time'
  },
  computed:{
    filterItem: function() {
      let filterStock = this.selectedStock,
        filterDistance = this.selectedDistance

      return this.searchResult.filter(function(item) {
        let filtered = true
        if (filterStock && filterStock.length > 0) {
          filtered = item.stock == filterStock
        }
        if (filtered) {
          if (filterDistance && filterDistance.length > 0) {
            filtered = item.distance == filterDistance
          }
        }
        return filtered
      })
    }
  },
  methods: {
    search: function() {
      let filterType = this.selectedType,
        filterCountry = this.selectedCountry,
        filterYear = this.selectedYear

      this.itemsToShow = 2;
      
      this.searchResult = this.items.filter(function(item) {
        let filtered = true
        if (filterType && filterType.length > 0) {
          filtered = item.type == filterType
        }
        if (filtered) {
          if (filterCountry && filterCountry.length > 0) {
            filtered = item.country == filterCountry
          }
        }
        if (filtered) {
          if (filterYear && filterYear.length > 0) {
            filtered = item.year == filterYear
          }
        }
        return filtered
      })
    },
    priceSort: function(){
        this.sortByPrice = !this.sortByPrice
      if(this.sortByPrice)
      this.sort = 'price'
    },
    timeSort: function(){
        this.sortByTime = !this.sortByTime
      if(this.sortByTime)
      this.sort = 'time'
    }
  },
  mounted() {
    this.search()
  }
})
.list-item{
  margin-top:50px;
}

#app{
  position:relative;
  padding-bottom: 200px;
}

span{
  margin: 0 15px;
  cursor:pointer;
}

.filter-box{
  margin-top:15px;
}

.card{
  box-shadow:0px 10px 16px rgba(0,0,0,0.16);
  width:400px;
  padding:20px 30px;
  margin-bottom:30px;
}

button{
  background-color: #1cf478;
  border:none;
  padding: 10px 25px;
  font-weight:bold;
  border-radius: 15px;
}

select{
  border:none;
  padding: 10px 15px;
  background-color:#c1c1c1; 
  border-radius:10px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.1.1/vue.js"></script>

<div id="app">
  <div class="search-box">
    <select v-model="selectedType">
      <option value="" disabled selected hidden>Type</option>
      <option value="mercedes">Mercedes</option>
      <option value="bmw">BMW</option>
    </select>

    <select v-model="selectedCountry">
      <option value="" disabled selected hidden>Country</option>
      <option value="belgium">Belgium</option>
      <option value="england">England</option>
    </select>

    <select v-model="selectedYear">
      <option value="" disabled selected hidden>Year</option>
      <option value="2019">2019</option>
      <option value="2020">2020</option>
    </select>
    
    <button @click="search">Search</button>
  </div>
  
  <div class="filter-box">
    <h6>Filter:</h6>
    <select v-model="selectedStock" @change="filterItem">
      <option value="" disabled selected hidden>Stock</option>
      <option value="sold">Sold</option>
      <option value="available">Available</option>
    </select>
    
    <select v-model="selectedDistance" @change="filterItem">
      <option value="" disabled selected hidden>Kilometers</option>
      <option value="500">500 KM</option>
      <option value="5000">5000 KM</option>
      <option value="10000">10.000 KM</option>
    </select>
    
    <span class="price" @click="priceSort">Price</span>
    <span class="response" @click="timeSort">Time Response</span>
    
  </div>

  <section class="result">
    <div class="container-fluid">
        <div class="row list-item" v-for="(item, id) in searchResult" :key="id">
          <div class="col-3 card" v-if="id < itemsToShow">
            <p>Name: {{ item.name }}</p>
            <p>Car: {{ item.type }}</p>
            <p>Year: {{ item.year }}</p>
            <p>Country: {{ item.country }}</p>
            <p>Price: ${{ item.price }}</p>
            <p>stock: {{ item.stock }}</p>
            <p>distance: {{ item.distance }}</p>
          </div>
        </div>
      
        <div class="row">
          <div class="col-12">
            <button @click="itemsToShow += 1">Load More</button>
          </div>
        </div>
    </div>
  </section>
</div>

标记

请参考此codeandbox以根据您的代码进行演示。

我的改变

  1. filterResultdata之上添加searchResult来处理过滤器结果,我们仅将其呈现filterResult为结果。这将把“搜索”和“过滤器”的逻辑分开,使逻辑更清晰。
  2. 只要过滤器选择的值发生变化,我们就会触发filterItems方法作为@click处理程序。(以前您使用的是计算属性,这还不够简单,我们可以简单地调用方法@change并更新filter results数据。
  3. 无论何时触发搜索,我们都会重置过滤器选择值,并显示所有搜索结果(filterResultsearchResult没有过滤器值的情况相同)。
  4. 至于排序,对于这两个排序span元素,我们只能更新this.sort数据,并且只要排序标准发生变化,就可以使用watch触发sortItems方法来简化方法。您可能需要sortItems根据需要调整方法。当然,您可以为这两个“排序”按钮编写两个单独的方法,完全由您决定:)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用vue js和axios动态网址的搜索过滤器

来自分类Dev

使用 dc.js 的简单列表过滤器和搜索过滤器?

来自分类Dev

贴上Servlt过滤器后,CSS和JS无法正常工作

来自分类Dev

带Rails的Angular JS过滤器无法正常运行

来自分类Dev

Angular.js过滤器无法正常工作

来自分类Dev

带Rails的Angular JS过滤器无法正常运行

来自分类Dev

Vue.js无法解析过滤器:键

来自分类Dev

使用 Knockout JS 搜索嵌套 json 数组的过滤器

来自分类Dev

使用react.js实现过滤器功能

来自分类Dev

无法在Angular JS中使用ng-hide和过滤器显示“未找到”

来自分类Dev

Angular.js linq.js过滤器无法正常工作的地方

来自分类Dev

Angular JS搜索过滤器未使用Firebase过滤数据

来自分类Dev

如何在Vue.js中按标题创建搜索过滤器?

来自分类Dev

唯一过滤器在Angular.js中无法正常工作

来自分类Dev

内部过滤器在淘汰赛JS中无法正常工作

来自分类Dev

Angular JS多重选择框过滤器无法正常工作?

来自分类Dev

如何在Vue JS中使用v-for和orderBy过滤器反转数组的顺序?

来自分类Dev

使用“多个过滤器”的Angular JS

来自分类Dev

我无法在vue.js中实现对数组的过滤器

来自分类Dev

Angular.js中的搜索过滤器,

来自分类Dev

TreeView中的React.js搜索过滤器

来自分类Dev

为什么此切换和过滤器在Vue JS中不起作用?

来自分类Dev

使用dc.js,d3.js和交叉过滤器的参考错误

来自分类Dev

使用更新功能时,Chart.js更改选定的图例过滤器

来自分类Dev

使用JS寻找我的过滤器功能的较短版本

来自分类Dev

无法理解这段JS代码【数组和过滤器】

来自分类Dev

使用vue.js注册自定义过滤器

来自分类Dev

使用计算的属性向Vue.js表添加过滤器

来自分类Dev

使用angular.js过滤器按月过滤日期

Related 相关文章

  1. 1

    使用vue js和axios动态网址的搜索过滤器

  2. 2

    使用 dc.js 的简单列表过滤器和搜索过滤器?

  3. 3

    贴上Servlt过滤器后,CSS和JS无法正常工作

  4. 4

    带Rails的Angular JS过滤器无法正常运行

  5. 5

    Angular.js过滤器无法正常工作

  6. 6

    带Rails的Angular JS过滤器无法正常运行

  7. 7

    Vue.js无法解析过滤器:键

  8. 8

    使用 Knockout JS 搜索嵌套 json 数组的过滤器

  9. 9

    使用react.js实现过滤器功能

  10. 10

    无法在Angular JS中使用ng-hide和过滤器显示“未找到”

  11. 11

    Angular.js linq.js过滤器无法正常工作的地方

  12. 12

    Angular JS搜索过滤器未使用Firebase过滤数据

  13. 13

    如何在Vue.js中按标题创建搜索过滤器?

  14. 14

    唯一过滤器在Angular.js中无法正常工作

  15. 15

    内部过滤器在淘汰赛JS中无法正常工作

  16. 16

    Angular JS多重选择框过滤器无法正常工作?

  17. 17

    如何在Vue JS中使用v-for和orderBy过滤器反转数组的顺序?

  18. 18

    使用“多个过滤器”的Angular JS

  19. 19

    我无法在vue.js中实现对数组的过滤器

  20. 20

    Angular.js中的搜索过滤器,

  21. 21

    TreeView中的React.js搜索过滤器

  22. 22

    为什么此切换和过滤器在Vue JS中不起作用?

  23. 23

    使用dc.js,d3.js和交叉过滤器的参考错误

  24. 24

    使用更新功能时,Chart.js更改选定的图例过滤器

  25. 25

    使用JS寻找我的过滤器功能的较短版本

  26. 26

    无法理解这段JS代码【数组和过滤器】

  27. 27

    使用vue.js注册自定义过滤器

  28. 28

    使用计算的属性向Vue.js表添加过滤器

  29. 29

    使用angular.js过滤器按月过滤日期

热门标签

归档