vue的简单使用5-过滤器的使用

vue过滤器可以格式化常用文本,vue过滤器只能在插值表达式{{}}和v-bind中使用

顾名思义,过滤就是一个数据经过了这个过滤之后出来另一样东西,可以是从中取得你想要的,或者给那个数据添加点什么装饰,那么过滤器则是过滤的工具。例如,从['abc','abd','ade']数组中取得包含‘ab’的值,那么可通过过滤器筛选出来‘abc’和‘abd’;把‘Hello’变成‘Hello World’,那么可用过滤器给值‘Hello’后面添加上‘ World’;

一、定义一个全局过滤语法:
vue.filter("过滤器名称",函数)

定义一个Vue全局过滤器很简单,使用Vue的filter方法,第一个参数是过滤器的名称,第二个参数是处理函数,那如何使用过滤器呢 来个例子

<div id="app">
    <p>{{ msg | myFilter }}</p>
<!--
{{ msg | myFilter }}第一个参数msg为data中的数据,第二个参数myFilter是过滤器名称
两者之间用’’|’'隔开,当程序运行时,msg的值会传递到过滤器,经过过滤器后,最终的结果是过滤器返回的值。
-->
</div>
<script>
//过滤器
  Vue.filter("myFilter",function(msg){//myFilte为r过滤器名称,msg就是需要过滤的数据
   //注意  使用正则表达式的话不要加引号
  //乳猪/g 会匹配字符串中所有的肥羊,replace会将匹配到的字符全部替换成肥羊
return msg.replace(/小乳猪/g,"小肥羊")
})
let vm  = new Vue({
el:"app",
data:{
      msg: '看,远方有头小乳猪,晚上可以烤乳猪吃了  哈哈哈哈!'
    }
})
</script>

上面的代码中,首先在data中定义了一个字符串msg,现在,然后定义了一个全局过滤器myFilter,在过滤器中会将所接受到的参数中的乳猪二字替换成肥羊二字,并返回
运行截图:


微信图片_20190516164147.png

再来看看过滤器中的第二个参数-----回调函数

function (msg) {
        //注意  使用正则表达式的话不要加引号
        ///乳猪/g 会匹配字符串中所有的肥羊,replace会将匹配到的字符全部替换成肥羊
        return msg.replace(/乳猪/g, "肥羊");
    })

可以发现里面有一个参数,{{msg |myFilter}}中的msg的值(即data)会保存在回调函数中的第一个形参中,
接下来修改一下上面的代码:

<div id="head">
//这里的字符串小黑牛将传给过滤器的第2个参数,也就是arg , 因为第1个是数据本身。
    <p>{{ msg | myFilter("小黑牛") }}</p>
</div>
<script>
    //Vue过滤器
    Vue.filter('myFilter', function (msg, arg) {
        //注意  使用正则表达式的话不要加引号
        return msg.replace(/乳猪/g, arg);
    })
    let vue1 = new Vue({
       el: '#head',
       data: {
           msg: '看,远方有头小乳猪,晚上可以烤乳猪吃了  哈哈哈哈!'
       }
    });
</script>

修改过滤器中的函数,加入一个形参arg,然后给过滤器传递一个参数“黑牛”,运行:
微信图片_20190516170602.png

可以发现我们传递了一个黑牛,而运行后msg中的乳猪也全变成了黑牛,这是因为使用过滤器时可以传递参数进去,可以传递多个参数,但是回调函数的第一个参数一定是要过滤的数据。

那可以同时使用多个过滤器吗?答案是肯定了,接着修改上面的代码:

<div id="head">
    <p>{{ msg | myFilter("黑牛") | myFilter2 }}</p>
</div>
<script>
    //Vue过滤器
    Vue.filter('myFilter', function (msg, arg) {
        //注意  使用正则表达式的话不要加引号
        return msg.replace(/乳猪/g, arg);
    });
    Vue.filter('myFilter2', function (msg) {
        //注意  使用正则表达式的话不要加引号
        return msg + "-----我是过滤器2";
    })
    let vue1 = new Vue({
       el: '#head',
       data: {
           msg: '看,远方有头小乳猪,晚上可以烤乳猪吃了  哈哈哈哈!'
       }
    });
</script>

新定义一个过滤器myFilter2,他的作用在原字符串的尾部加上‘-----我是过滤器2’这句话,接下来在插值表达式中在过滤器myFilter后面继续添加过滤器,

运行截图:


d568c3e3d957ab677d1d647c73670e3.png

所以msg被过滤器1过滤后返回的值会被后一个过滤器所过滤,知道最后一个过滤器才会返回最终的结果。

局部过滤器的定义

在一个页面中可以定义多个Vue的实例,每个Vue的实例都可以使用全局过滤器,既然全局过滤器是所有的Vue实例都能使用,那么私有过滤器就是只能是定义过滤器的实例使用,

定义一个私有过滤器要在创建Vue实例的实例定义,通过filters来定义(别忘了s,全局的没有s),定义filters和定义methods差不多

<div id="head">
    <p>{{ date | myFilter1 }}</p>
</div>
<script>
    let vue1 = new Vue({
        el: '#head',
        data: {
            date: '今天做梦梦见今天要做梦!'
        },
        filters: {
            myFilter1: function (data) {
                return data.replace(/今天/g, '明天');
            }
        }
    });
</script>

所有的私有过滤器都要定义在filters中,myFilter1是过滤器的名字,function (data)函数体是要过滤要执行的方法,功能和上面的一样,将所接受到的数据中的‘今天’修改成‘明天’并返回
如图:


72a7fc04585d4a75300f54cb4f51d5c.png

可以看到,今天全部变成了明天

私有过滤器的使用方法和全局过滤器差不多,至于用谁就得实际情况来选择了

如果全局过滤器和私有过滤器重名了,那会使用谁呢?

答案是会使用私有过滤器,就近原则
例子###

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title></title>
        <!-- <link rel="stylesheet" type="text/css" href="css/index.css" /> -->
    </head>
    <body>
        <div id="app">
            <!-- v-pre不编译{{}},直接打印{{}} -->
            {{date | formate}}
            <span v-pre>{{11}}</span>
        </div>
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
        <script>
            var paDate = function(value) {
                return value < 10 ? '0' + value : value;
            }
            var app = new Vue({
                el: "#app",
                data: {
                    date: new Date(),
                    timer: ""
                },
                //定义过滤器
                filters: {
                    formate: function(date) { //date就是需要过滤的数据,会保存在回调函数中的第一个形参中,
                        var year = date.getFullYear();
                        var month = paDate(date.getMonth() + 1);
                        var day = paDate(date.getDate());
                        var hour = paDate(date.getHours());
                        var minutes = paDate(date.getMinutes());
                        var seconds = paDate(date.getSeconds());
                        return year + '-' + month + '-' + day + '-' + hour + '-' + minutes + '-' + seconds;
                    }
                },

                mounted: function() {
                    //保证this的指向作用域保持一致
                    var _this = this;
                    this.timer = setInterval(() => {
                        _this.date = new Date();
                    }, 1000)
                },
                //在vue实例消失之前,清除我们的计时器
                beforeDestroy: function() {
                    if (this.timer) {
                        clearInterval(this.timer)
                    }
                }
            })
            //过滤器也可以串联,而且可以接收参数,例如:
            /*
         串联
       {{ message | filterA | filterb}}
        接收参数
       {{ message | filterA( "argl","arg2")}}
         这里的字符串缸argl arg2 将分别传给过滤器的第1个和第2个参数,因为第1个是数据本身。
过滤器应当用于处理简单的文本转换
         */
        </script>
    </body>
</html>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343