---
# System prepended metadata

title: Day 05 分類資料篩選
tags: [Vue]

---

# Day 05 分類資料篩選

###### tags: `Vue` 

<style>.red{color:red}</style>

![](https://i.imgur.com/rndUUXL.jpg)


### 分類catalog篩選製作

html模板使用和[Day04新增列表資料](https://hackmd.io/1TbML8dRRpC3NjM5pRbXTA?both)一樣模板,可以去Day04 最下面jsfiddle link去找 ,只是Day 05 分類資料篩選的輸入框刪除<kbd>@keyup.enter="inpuHandler"</kbd> ,和 new vue裡面的 <kbd>methods</kbd>function ,並且將select option新增最上面<kbd> <option>全部</option></kbd> ,將data的input.type裡資料改成<kbd> type: '全部',</kbd>

所有處理資料都使用<kbd>computed</kbd> , 所以這邊去new vue部分新增

```
let vm = new Vue({
            el: '#app',
            data: data,
            computed: {

            }
        })
```

### 綁定select catalog

在computed新增一個新的function <kbd>typeMenu(){ }</kbd> , 篩選有兩種狀況

1. <kbd>input.type</kbd> 不等於option <kbd>全部</kbd> ,進行篩選動作 <kbd> filter</kbd>篩選this.menu ,畫面分類 <kbd>item.type</kbd>必須等於select的<kbd>this.input.type</kbd> 。
 

2. <kbd>input.type</kbd> option <kbd>全部</kbd>,那就return所有資料 <kbd>this.menu</kbd> 。

而原版渲染item畫面的html是綁定<kbd>v-for="(item , index) in menu"</kbd>,
現在改為<kbd>v-for="(item , index) in typeMenu"</kbd>


```
 <div class="row datalist ml-0 mt-5 ">
                <div class="col-55  libg mx-2 my-3 vue-list d-flex" v-for="(item , index) in typeMenu">
                    <div class="nolist ml-n2 pt-2 pl-2">{{index + 1}}</div>
                    <div class="catolog ml-n1 pt-2">{{item.type}}</div>
                    <a class="pl-2 letter-sp-1 text-decoration-none dark-g vue-title pt-2"
                        target="vue-iron ">{{item.title}}</a>

                </div>

            </div>
```


```
 let vm = new Vue({
            el: '#app',
            data: data,
            computed: {
             
                typeMenu(){
                    if(this.input.type !== '全部') {

                        return this.menu.filter(item => {
                        return item.type == this.input.type

                        })
                       
                    } else {
                        return this.menu
                    }
                },

                

            }

        })
```

![](https://i.imgur.com/Jcd9F8C.jpg)


### 進一步文字輸入框使用輸入文字篩選

文字輸入框是select篩選完後繼續篩選,所以是放在select的 typeMenu() function後面 ,這邊給他命名為<kbd>titleMenu()</kbd>

#### 輸入框filter操作邏輯

如果輸入框裡的文字<kbd>this.input.title</kbd>篩選<kbd>filter</kbd>,
將this.typeMenu裡面item裡字串<kbd>item.title</kbd>和輸入框裡的文字<kbd>this.input.title</kbd>做比對<kbd>indexOf</kbd>,如果得到的值不等於<kbd>-1</kbd>,表示有找到配對值,渲染出畫面 。反之輸入原版select標籤篩選過後畫面<kbd>this.typeMenu</kbd>

[String.prototype.indexOf()](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/indexOf)

> indexOf() 方法返回調用它的對像String 中第一次出現的指定值的索引，從fromIndex處進行搜索。如果未找到該值，則返回-1。

```
 titleMenu(){
                    if(this.input.title){
                        return this.typeMenu.filter(item => {
                        return item.title.toLowerCase().indexOf(this.input.title.toLowerCase()) 
                        !== -1

                        })
                    } else {
                        return this.typeMenu
                    }
                }
```

原本渲染html模板綁的是<kbd>v-for="(item , index) in typeMenu"</kbd>,現在把剛做好的titleMenu()替換掉 , <kbd>v-for="(item , index) in titleMenu"</kbd>


註:第一次做這種小作業是去年,被一個html 綁的v-for=" item in data " data改兩三次搞得暈頭轉向 , 這陣子是第三次做類式小作業,看了 [Alex 宅幹嘛](https://www.youtube.com/watch?v=Day303Ez-bA&list=PLEfh-m_KG4dYor8h4Hi2lqKJ0xqNTFh16&index=7) 影片突然觀念懂了 ! 超開心,

**觀念整理如下:**

1. 其實這種資料處理類需要依序處理,第一次綁定 <kbd>v-for="(item , index) in menu</kbd>, 是原始未處理data渲染綁定

2. select經過 <kbd>input.type</kbd> 篩選,第二次綁定<kbd>v-for="(item , index) in typeMenu </kbd> 是第二層資料處理 ,裡面有包含<kbd>this.menu</kbd> , 所以可以直接替換掉<kbd>v-for="(item , index) in menu</kbd>

3.在input輸入框第三次綁定<kbd>v-for="(item , index) in titleMenu </kbd>,篩選比對<kbd>indexOf</kbd>輸入框文字<kbd>this.input.title</kbd>和經過select標籤篩選過結果,是第三層資料處理 ,裡面有包含<kbd>this.typeMenu</kbd>所以可以直接替換掉<kbd>v-for="(item , index) in typeMenu</kbd>


[完整原始碼](https://jsfiddle.net/Harrmonia/mu5vwhoa/1/)


參考網路資訊
[[ Vue.js 手牽手，一起嗑光全家桶 ] 開胃餐點 - 期間限定篩選佐資料轉換](https://www.youtube.com/watch?v=Day303Ez-bA&list=PLEfh-m_KG4dYor8h4Hi2lqKJ0xqNTFh16&index=7)

*講師個人頻道資料很豐富,情況允許大家多多看完影片廣告,和每個月訂閱扣款donate,當做請講師喝杯咖啡犒賞辛苦無私