Vue过滤器

1. 概述

在Vue.js中,过滤器主要用于文本的格式化,或者组件数据的过滤与排序等。从Vue2.0.0版本开始,内置的过滤器已经被删除,需要自己编写。

2. 全局过滤器与局部过滤器

过滤器的本质上是一个函数,与自定义指令相似,过滤器也分为全局过滤器和局部过滤器。全局过滤器使用Vue.filter()方法来注册,该方法接受两个参数,第一参数是过滤器的ID(即名字),第二个参数是一个函数对象,过滤器要实现的功能在这个函数中定义。语法形式如下:
Vue.filter(id, [definition])
局部过滤器是在Vue实例的选项对象中使用filters选项来注册。
下面编写一个将字符串首字符转换为大写字母的全局过滤器。
在这里插入图片描述
如果换成局部过滤器,编写形式如下:
在这里插入图片描述
要注意的是:

  1. 当全局过滤器和局部过滤器重名时,会采用局部过滤器。
  2. 与自定义指令一样,全局过滤器可以在任何Vue实例的模板中使用,而局部过滤器只能在该实例绑定的视图中使用。
    过滤器可以用在两个地方:双花括号插值和v-bind表达式使用时通过管道符|添加到表达式的尾部使用。
    在这里插入图片描述
    不要去尝试在其他指令的表达式中使用,没有结果还会报错。

2.1 过滤器参数

过滤器函数总是接受表达式的值作为第一个参数,如{{message|capitalize}},message的值将作为capitalize过滤器函数的第一个参数。过滤器的本质上是一个JavaScript函数,自然也可以接受多个参数。
下面编写一个为表达式的值添加前后缀的过滤器。
在这里插入图片描述

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
</head>

<body>
    <div id="app">
        <p>{{filename | format('vue',suffix)}}</p>
    </div>

    <script>
        Vue.filter('format', function (value, prefix, suffix) {
            if (!value) return '';
            value = value.toString();
            return prefix + "-" + value + "." + suffix;
        })

        var vm = new Vue({
            el: "#app",
            data: {
                filename: 'filters',
                suffix: 'js'
            }
        });
    </script>
</body>

</html>

filename的值作为format过滤器的第一个参数,普通字符串’vue’作为format过滤器的第二个参数,表达式suffix的值作为format过滤器的第三个参数,最终的输出结果为vue-filters.js
如果过滤器函数需要接受任意多个参数,可以使用ECMAScript6中引入的rest参数
在这里插入图片描述
当然,不建议把过滤器的功能做的很复杂,这违背了过滤器的初衷,毕竟在Vue.js中还有方法、计算属性、监听器等各种特性。

2.2 过滤器的串联

在这里插入图片描述
在这里插入图片描述

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
</head>
<body>
    <div id="app">
        <p>{{message | uppercase | reverse}}</p>
    </div>

    <script>
        Vue.filter('uppercase', function(value){
            if(!value) return '';
            value = value.toString();
            return value.toUpperCase();
        })

        Vue.filter('reverse',function(value){
            if(!value) return '';
            value = value.toString();
            return value.split('').reverse().join('');
        })

        var vm = new Vue({
            el : "#app",
            data:{
                message:'hello world'
            }
        });
    </script>
</body>
</html>

3.示例代码

1.

<template>
  <div>
    <ul>
      <li>姓名:{{ emp.name }}</li>
      <!-- 过滤器filter: 用于修改 {{}} 中的值 -->
      <!-- {{ 值 | 过滤器 }} -->
      <li>性别:{{ emp.gender | sex }}</li>
      <li>婚姻:{{ emp.married | marry }}</li>
      <li>年龄:{{ emp.age | age_group }}</li>
    </ul>
  </div>
</template>
<script>
export default {
  data() {
    return {
      emp: { name: "Lucy", gender: 0, married: true, age: 27 },
    };
  },
  // vfilter: 过滤器
  filters: {
    age_group(value) {
      if (value < 18) {
        return "少年";
      } else if (value <= 26) {
        return "青年";
      } else if (value <= 38) {
        return "中年";
      } else {
        return "其他..";
      }
    },
    marry(value) {
      return value ? "已婚" : "未婚";
    },
    // {{ 性别 | sex }}
    sex(value) {
      // value 就是 | 左侧的值
      // return 的值就是 过滤后的结果
      // 此处 0代表女 1代表男
      return ["女", "男"][value];
      // arr[序号]. 数组字面量是[]
      // 就会出现 [数组..][序号] 格式
    },
  },
};
</script>
<style lang="scss" scoped></style>

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

boy快快长大

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值