Vue過濾器


在了解過濾器之前,我們需要明確一個概念--過濾器,本質上都是函數。其作用在於用戶輸入數據后,它能夠進行處理,並返回一個數據結果。Vue.js與AngularJS中的過濾器語法有些類似,使用管道符(|)進行連接。

一、內置過濾器

  Vue.js內置了一系列常用的過濾器,可以直接進行調用。這些內置過濾器都相對比較簡單,如果要實現比較復雜或者需要定制的過濾功能,還需要借助自定義過濾器的方式。當然,這些內置的過濾器使用時無須定義,使用起來比較容易。

1.字母操作

  Vue.js內置了capitalize、uppercase、lowercase三個過濾器用於處理英文字符。注:這三個過濾器僅針對英文字符串使用。

  1.capitalize

  capitalize過濾器用於將表達式中的首字母轉換為大寫形式。代碼示例如下:

{{'ddfe' | capitalize}}
//'ddfe'=>'Ddfe'

  2.uppercase

  uppercase過濾器用於將表達式中的所有字母轉換為大寫形式。代碼示例如下:

{{'ddfe' | uppercase}}
//'ddfe'=>'DDFE'

  3.lowercase

  lowercase過濾器用於將表達式中的所有字母轉換為小寫形式。代碼示例如下:

{{'DDFE'} | lowercase}
//'DDFE' => 'ddfe'

2.json過濾器

  Vue.js中的json過濾器本質上是JSON.stringify()的精簡縮略版,可將表達式的值轉換為JSON字符串,即輸出表達式經過JSON.stringify()處理后的結果。json可接受一個類型為Number的參數,用於決定轉換后的JSON字符串的縮進距離,如果不輸入該參數,則默認為2。代碼示例如下:

<pre>{{didiFamily | json 4}}</pre>
/*
以四個空格的縮進打印一個對象:
didiFamily:{'name':'ddfe','age':3}
=>
{
    'name':'ddfe',
    'age':3
}
*/

3.限制

  Vue.js中內置了limitBy、filterBy、orderBy三個過濾器用於處理並返回過濾后的數組,比如與v-for搭配使用。注意,這三個過濾器所處理的表達式的值必須是數組,否則程序會報錯。

  1.limitBy

  limitBy過濾器的作用是限制數組為開始的前N個元素,其中N由傳入的第一個參數指定。第二個參數可選,用於指定開始的偏移量,默認為0,即不偏移。如果第二個參數為5,則表示從數組下標為5的地方開始計數。代碼示例如下:

//只顯示開始的10個元素
<div v-for="item in items | limitBy 10"></div>

  2.filterBy

  filterBy過濾器的使用比較靈活,其第一個參數可以是字符串或者函數。過濾條件是:'string||function'+in+'optionKeyName'。

  如果第一個參數是字符串,那么將在每個數組元素中搜索它,並返回包含該字符串的元素組成的數組。代碼示例如下:

<div v-for="item in items | filterBy 'hello'"></div>

  上例中,只顯示包含hello字符串的元素。

  如果item是一個對象,過濾器將遞歸地在它所有的屬性中搜索。為了縮小搜索范圍,可以指定一個搜索字段。代碼示例如下:

<div v-for="member in  didiFamily | filterBy 'ddfe' in 'name'"></div>

  上例中,過濾器只在用戶對象的name屬性中搜索ddfe。最好始終限制搜索范圍以提高效率與性能。

  3.orderBy

  orderBy過濾器的作用是返回排序后的數組。過濾條件是:'string || array ||function' + 'order≥0為升序 || order<0為降序'。第一個參數可以是字符串、數組或者函數。第二個參數order可選,決定結果為升序或降序排列,默認為1,即升序排列。

  若輸入參數為字符串,則可同時傳入多個字符串作為排序鍵名,字符串之間以空格分隔。代碼示例如下:

  

<ul>
    <li v-for="user in users | orderBy 'lastName' 'firstName' 'age'">
        {{user.lastName}} {{user.firstName}} {{user.age}}
    </li>
</ul>

  此時將按照傳入的排序鍵名的先后順序進行排序。

  注:事實上,當傳入參數為字符串或者數組時,最終調用的也是sort()函數,只不過Vue.js提前作了一些處理,比如設置了默認的compare函數等,根據傳入的compare函數進行排序。

4.currency過濾器

  currency過濾器的作用是將數字值轉換為貨幣形式輸出。其第一個參數接受類型為String的貨幣符號,如果不輸入,則默認為美元符號$。第二個參數接受類型為Number的小數位,如果不輸入,則默認為2。注意,如果第一個參數采取默認形式,而需要第二個參數修改小數位,則第一個參數不可省略。代碼示例如下:

{{amount | currency}}
//12345 => $12345.00

  使用其他符號,比如人民幣符號,代碼示例如下:

{{amount | currency '¥'}}
//12345 => ¥12345.00

5.debounce過濾器

  debounce過濾器的作用是延遲處理器一定的時間執行。其接受的表達式的值必須為函數,因此其一般與v-on等指令結合使用。debounce接受一個可選的參數作為延遲時間,單位為毫秒。如果沒有該參數,則默認的延遲時間為300毫秒。經過debounce包裝的處理器在調用之后將至少延遲設定的時間再執行。如果在延遲結束前再次調用,則延遲時長將重置為設定的時間。通常,在監聽用戶input事件時使用debounce過濾器比較有用,可以防止頻繁調用方法,debounce的用法參考如下:

<input @keyup="onKeyup | debounce 500">

二、自定義過濾器

  大多數情況下,Vue.js中內置的過濾器並不能滿足我們的需求,好在Vue.js還提供了自定義過濾器的API供用戶進行功能擴展。

1.filter語法

  在Vue.js中也存在一個全局函數Vue.filter用於構造過濾器:

Vue.filter(ID,function(){})

  該函數接受兩個參數,其中第一個參數為過濾器ID,作為用戶自定義過濾器的唯一標識;第二個參數則為具體的過濾器函數。過濾器函數以值為參數,返回轉換后的值。

  1.單個參數

  注冊一個名為reverse的過濾器,作用是將字符串反轉輸出。代碼示例如下:

Vue.filter('reverse',function(value){
    return value.split('').reverse().join('');
})
<span v-text="message | reverse"></span>
//'abc' => 'cba'

  2.多參數

  過濾器函數除了以值為參數外,還支持接受任意數量的參數,參數之間以空格分隔。代碼示例如下:

Vue.filter('wrap',function(value,begin,end){
   return begin + value +end 
})
<span v-text="message | wrap 'before' 'after'"></span>
//'hello' => 'before hello after'

  3.雙向過濾器

  上面的過濾器函數都是在Model數據輸出到View層之前進行數據轉化的,實際上Vue.js還支持把來自視圖(input元素)的值在寫回模型前進行轉化,即雙向過濾器。代碼如下

Vue.filter(id,{
   //model -> view 
   //read 函數可選
   read:function(val){},
   //view -> model
   //write函數將在數據被寫入Model之前調用
   //兩個參數分別為表達式的新值和舊值
   write:function(newVal,oldVal){}      
})

  4.動態參數

  filter語法還有一個需要注意的點:動態參數。如果過濾器參數沒有用引號包起來,則它會在當前vm作用域內動態計算。此外,過濾器函數的this始終指向調用它的vm。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM