---
# System prepended metadata

title: Vue店商網頁-產品多條件搜尋功能
tags: [Vue, 店商網頁]

---

###### tags: `Vue` `店商網頁`
{%hackmd BJrTq20hE %}
# Vue店商網頁-產品多條件搜尋功能
既然是店商網頁那總要有搜尋功能吧!
1.有關鍵字搜尋
2.有最大與最小價格

## 該如何做到呢?
1.複製一個從api撈回來的陣列資料，這麼做的好處是為了減輕api伺服器的負擔外也是這個多條件搜索的關鍵。
2.使用重複的陣列資料進行過濾，例如透過關鍵字所濾出的資料，繼續以價格為條件進行過濾。
3.文字的搜尋使用indexOf與filter這個語法。

## 直接來看怎麼寫的吧?

1.在data中主要是以guestShowProduct作為呈現畫面的資料。
2.以guestProduct為過濾資料的起點。
3.guestShowSearch()(下方範例第32行)中一開始清空guestShowProduct，接著由第一個子函數infoFilter()(下方範例第8行)過濾資料。
4.infoFilter()使用forEach配上indexOf撈出資料，並存在guestShowProduct。
5.考慮到不是所有條件都會用到，所以在minFilter()與maxFilter()增加了如果沒有guestShowProduct沒有infoFilter()的資料就以guestProduct為起點(下方範例第17、25行)。
6.minFilter()與maxFilter()中因為參數帶null時在guestShowSearch()中最後的函式依然會運行所以特別在minFilter()與maxFilter()加上得if判斷式，使參數為null時不會有結果產生(下方範例第16、24行)

JS
```javascript=
data () {
    return {
      guestProduct: [],
      guestShowProduct: [],
    }
  },
methods: {
    infoFilter (info) {
      this.guestProduct.forEach((item) => {
        if (item.category.indexOf(info) !== -1 ||item.content.indexOf(info) !== -1 ||item.description.indexOf(info) !== -1 ||item.title.indexOf(info) !== -1) {
          this.guestShowProduct.push(item)
        }
      })
    },
        
    minFilter (min, max, info) {
      if (min) {
        if (this.guestShowProduct.length === 0 && !info && !max) {
          this.guestShowProduct = this.guestProduct
        }
        this.guestShowProduct = this.guestShowProduct.filter(item => min <= item.price || min <= item.origin_price)
      }
    },
    maxFilter (max, min, info) {
      if (max) {
        if (this.guestShowProduct.length === 0 && !info && !min) {
          this.guestShowProduct = this.guestProduct
        }
        this.guestShowProduct = this.guestShowProduct.filter(item => item.price <= max || item.origin_price <= max)
      }
    },
    guestShowSearch (info, min, max) {
      if (info || min || max) {
        this.guestShowProduct = []
        this.infoFilter(info)
        this.minFilter(min)
        this.maxFilter(max)
      } else {
        this.guestShowProduct = this.guestProduct
      }
    }
}

```

