摘要:Vue的filters過濾器是比較常見的一個知識點,下面我將結合時間戳轉換的例子帶你快速瞭解filters的用法。

本文分享自華為雲社群《三分鐘掌握Vue過濾器filters及時間戳轉換》,作者:北極光之夜。。

一.速識概念:

大家好呀,Vue的filters過濾器是比較常見的一個知識點,下面我將結合時間戳轉換的例子帶你快速瞭解filters的用法~

按照官方的活來說,Vue.js 允許你自定義過濾器,可被用於一些常見的文字格式化。過濾器可以用在兩個地方:雙花括號插值和 v-bind 表示式 (後者從 2.1.0+ 開始支援)。過濾器應該被新增在 JavaScript 表示式的尾部,由“管道”符號指示。

簡單來說就是在filters過濾器裡定義一個處理函式,把函式名稱寫在管道符 “|” 後面,它就會處理管道符 “|” 前自定義的資料,其中自定義的資料會自動成為過濾器函式的引數。

<!-- 在雙花括號中 -->
{{ message | capitalize }} <!-- 在 `v-bind` 中 -->
<div v-bind:id="rawId | formatId"></div>

過濾器主要可以分為區域性過濾器和全域性過濾器,下面看詳細介紹。

二.區域性過濾器:

1. 區域性過濾器就是在一個元件的選項中定義本地的過濾器,只有該元件可以用。在我們一般開發中,對於時間後端一般只會返回一個時間戳讓前端自己處理,下面比如定義一個轉換時間戳為日期格式的過濾器(注意步驟):

<template>
<div>
<!-- 4. 渲染資料,設定過濾器 -->
{{ times | conversion }}
</div>
</template>
<script>
export default {
data() {
return {
// 1.模擬一個時間戳資料
times: 1616959086000,
};
},
// 2. 定義過濾器
filters: {
//3.定義一個處理函式,引數value為要處理資料
conversion: function (value) {
//呼叫Date的方法,處理時間戳
return new Date(value).toLocaleString();
},
},
};
</script>

結果,轉換成功:

2. 不僅如此,過濾器還可以串聯,就是說可以定義多個過濾器,比如下面,相當於先用 conversion函式處理 times 這個資料得出結果,然後繼續用 againChange函式處理前面的結果得出最終結果:

  {{ times | conversion | againChange }}

基本演示如下:

<template>
<div>
<!-- 5. 放過濾器 -->
{{ times | conversion | againChange }}
</div>
</template> <script>
export default {
data() {
return {
// 1.模擬一個時間戳資料
times: 1616959086000,
};
},
// 2. 定義過濾器
filters: {
//3.定義一個處理函式,引數value為要處理資料
conversion: function (value) {
//呼叫Date的方法,處理時間戳
return new Date(value).toLocaleString();
},
//4.再定義一個過濾器,給資料前加上"時間為:"這幾個字
againChange: function (value) {
return "時間為:" + value;
},
}, };
</script>

3. 同時,過濾器也是可以接收引數的, 比如我們改進第1小點的例子,把時間戳轉換為能指定格式的時間格式,將想要的時間格式作為過濾器引數,具體用法如下(注意步驟):

<template>
<div>
<!-- 4. 放過濾器,同時傳引數,返回指定格式的時間 -->
{{ times | conversion("yyyy-MM-dd HH:mm:ss 星期w") }}
</div>
</template> <script>
export default {
data() {
return {
// 1.模擬一個時間戳資料
times: 1616959086000,
};
},
// 2. 定義過濾器
filters: {
//3.定義一個處理函式,引數value為要處理資料,format為傳入引數
conversion: function (value, format) {
//這個轉換方法就不介紹了,看看就行,過濾器用法為主
var date = new Date(value);
function addZero(date) {
if (date < 10) {
return "0" + date;
}
return date;
}
let getTime = {
yyyy: date.getFullYear(),
yy: date.getFullYear() % 100,
MM: addZero(date.getMonth() + 1),
M: date.getMonth() + 1,
dd: addZero(date.getDate()),
d: date.getDate(),
HH: addZero(date.getHours()),
H: date.getHours(),
hh: addZero(date.getHours() % 12),
h: date.getHours() % 12,
mm: addZero(date.getMinutes()),
m: date.getMinutes(),
ss: addZero(date.getSeconds()),
s: date.getSeconds(),
w: (function () {
let a = ["日", "一", "二", "三", "四", "五", "六"];
return a[date.getDay()];
})(),
};
for (let i in getTime) {
format = format.replace(i, getTime[i]);
}
return format;
},
}, };
</script>

結果如下:

三.全域性過濾器:

既然叫全域性,那自然是在建立 Vue 例項之前全域性定義過濾器,配置好後全部元件直接用就行。一般在自定義的一個檔案裡專門定義。比如還是上面的處理時間戳的過濾器,用法如下:

1.在src目錄下定義filters資料夾,同時在資料夾裡定義一個filters.js檔案:

2.filters.js檔案程式碼如下:

const conversion = function (value, format) {
var date = new Date(value);
function addZero(date) {
if (date < 10) {
return "0" + date;
}
return date;
}
let getTime = {
yyyy: date.getFullYear(),
yy: date.getFullYear() % 100,
MM: addZero(date.getMonth() + 1),
M: date.getMonth() + 1,
dd: addZero(date.getDate()),
d: date.getDate(),
HH: addZero(date.getHours()),
H: date.getHours(),
hh: addZero(date.getHours() % 12),
h: date.getHours() % 12,
mm: addZero(date.getMinutes()),
m: date.getMinutes(),
ss: addZero(date.getSeconds()),
s: date.getSeconds(),
w: (function () {
let a = ["日", "一", "二", "三", "四", "五", "六"];
return a[date.getDay()];
})(),
};
for (let i in getTime) {
format = format.replace(i, getTime[i]);
}
return format;
}
export {
conversion //通過此處匯出方法
}

3.在main.js裡引入全域性過濾器:

設定全域性過濾器格式就是Vue.filter(‘過濾器名稱’,對應處理函式);

import {conversion} from './filters/filters.js'
Vue.filter('conversion', conversion);

4.在某個元件直接可以使用:

<template>
<div>
<!-- 2. 放過濾器,同時傳參,為指定格式時間 -->
{{ times | conversion("yyyy-MM-dd HH:mm:ss 星期w") }}
</div>
</template> <script>
export default {
data() {
return {
// 1.模擬一個時間戳資料
times: 1616959086000,
};
},
};
</script>

一樣的結果:

四.擴充套件:

可以發現,filters過濾器在用法上與computed計算屬性有點像,那它們區別是什麼呢?

  1. filters 可以傳參,但是不可以訪問this。不具備快取功能。同時filters可以串聯。可以在區域性和全域性設定。filter比較簡單,只在顯式呼叫時觸發,一般應用在模板渲染上。
  2. computed不可以傳參,可以訪問this,針對的是變數的操作。背後的處理邏輯比較複雜,具有快取能力,在元件內普適性更強,因此適用於複雜的資料轉換、統計等場景。

五.總結:

上面就是filters過濾器的大致內容了。總的來說,filters過濾器可以分為區域性過濾器和全域性過濾器。區域性過濾器在元件內部有效,全域性過濾器在每個元件都有效。其中,可以設定多個過濾器和傳引數給過濾器。一般過濾器應用在一些簡單的資料渲染上。

點選關注,第一時間瞭解華為雲新鮮技術~