过滤器

过滤器:用于数据输出之前的处理,例如给数字添加小数点等。

过滤器分为全局过滤器和私有过滤器,下面先看私有过滤器的使用方法。

私有过滤器

打开 HelloWorld 组件,把默认代码删除,实现这样一个案例:data 中声明 num 变量存入数字 10,在输出 num 时给数字 10 添加 3 位小数,代码如下。

<template>
  <div class="hello">
 //3.竖线又称作管道符,toFixed是过滤器的名字
    <h1>{{ num | toFixed }}</h1>
  </div>
</template>

<script>
export default {
  name: 'HelloWorld',
  data () {
    return {
      msg: 'Welcome to Your Vue.js App',
//1.声明变量num
      num: 10
    }
  },
//2.过滤器和data属性、methods属性平级,过滤器属性为filters
  filters: {
    // 表示管道符前面的变量,表示此过滤器要处理哪个数据
    // 过滤器必须有return返回值
    toFixed(val){
      return val.toFixed(3)
    }
  }
}
</script>

代码解析如下。

  • filters属性用于存放过滤器,和data属性、methods属性平级。

  • 过滤器是一个方法,其第一个参数是固定的,表示要处理的变量,且必须有return属性。

  • 过滤器使用的竖线又称作管道符,竖线后面就是过滤器的名字。

上述代码的运行结果如图7-6所示,给数字10添加3位小数。

image 2025 02 11 15 26 26 301
Figure 1. 图7-6 使用过滤器添加3位小数

过滤器就是一个方法,方法是可以传递参数的,下面讲解使用过滤器传递参数,代码如下。

视图层代码如下。

<template>
    <div class="hello">
        //3.竖线又称作管道符,toFixed是过滤器名字
        <h1>{{num|toFixed(3,')}}</h1>
    </div>
</template>

过滤器代码如下。

filters: {
    toFixed(val, data1, data2) {
        return data2 + val.toFixed(data1);
    }
}

运行结果如图7-7所示。

image 2025 02 11 15 28 43 278
Figure 2. 图7-7 过滤器传递$参数

代码解析如下。

过滤器调用时传入两个实参,即 3 和 $,因此过滤器定义需要有两个形参接收。

toFixed(val, data1, data2) 过滤器的第一个参数是不变的,所以两个形参是从第二个参数开始的。

全局过滤器

全局过滤器是在 main.js 中定义的,代码如下。

import Vue from 'vue'
import App from './App'
import router from './router'

Vue.config.productionTip = false

// 全局过滤器
// toFixed1 过滤器名字
// val 过滤器控制的元素
// data 调用过滤器时传递的参数
Vue.filter('toFixed1', function(val, data) {
  return val.toFixed(data)
})

new Vue({
  el: '#app',
  router,
  components: { App },
  template: '<App/>'
})

在 HelloWorld 组件调用全局过滤器,代码如下。

<template>
  <div class="hello">
    //2.为num1使用全局过滤器并传递参数
    <h1>{{ num1 | toFixed1(2) }}</h1>
  </div>
</template>

<script>
export default {
  name: "HelloWorld",
  data() {
    return {
      msg: "Welcome to Your Vue.js App",
      num: 10,
      //1.声明num1
      num1: 20
    };
  },
};
</script>

代码解析如下。

全局过滤器使用 Vue.filter 方法创建,第一个参数是过滤器名字,其调用方法和私有过滤器的调用方法相同。