Vue过滤器

373 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

Vue.js 过滤器

Vue.js 允许你自定义过滤器,可被用于一些常见的文本格式化,比如字母的大写、货币的千位使用逗号分隔。过滤器可以用在两个地方:双花括号插值和 v-bind 表达式 (后者从 2.1.0+ 开始支持)。过滤器应该被添加在 JavaScript 表达式的尾部,由“管道”符号指示。

//<!-- 在双花括号中    message:data中定义的属性       | 管道符    capitalize:过滤器        -->
{{ message | capitalize }}
​
//<!-- 在 `v-bind` 中         |管道符   formatId:过滤器 -->
<div v-bind:id="rawId | formatId"></div>

过滤器换算金额:

<body>
    <div id ="app"> 
        一碗烩面{{price|format_price('¥ ')}}
    
    </div>
​
    <script>
     //创建Vue实例,得到 ViewModel
     var vm = new Vue({
        el: '#app',
        data: {
            price:2000,
            money:100
        },
        filters: {
            //v 是管道符最前面的第一个参数
            //v2是调用过滤器传递的实参
            format_price(v,v2){
                return `${v2}${v/100}`;
            }
        }
     });
    </script>
</body>

用法:

你可以在一个组件的选项中定义本地的过滤器:

filters: {
  capitalize: function (value) {
    if (!value) return ''
    value = value.toString()
    return value.charAt(0).toUpperCase() + value.slice(1)
  }
}

或者在创建 Vue 实例之前全局定义过滤器:

Vue.filter('capitalize', function (value) {
  if (!value) return ''
  value = value.toString()
  return value.charAt(0).toUpperCase() + value.slice(1)
})
​
new Vue({
  // ...
})

过滤的规则是自定义的,通过给Vue示例添加选项filters来设置 过滤器是 JavaScript 函数,因此可以接收参数,过滤器函数总接收表达式的值 (之前的操作链的结果) 作为第一个参数。在上述例子中,capitalize 过滤器函数将会收到 message 的值作为第一个参数。

全局定义过滤器:

<body>
    <div id ="app"> 
        一碗烩面{{price|format_price('¥ ')}}
    
    </div>
​
    <script>
        
    //全局过滤器
    Vue.filter('format_price',function(v,v2){
        return `${v2}${v/100}`;
    })
     //创建Vue实例,得到 ViewModel
     var vm = new Vue({
        el: '#app',
        data: {
            price:2000,
            money:100
        },
        // filters: {
        //     //v 是管道符最前面的第一个参数
        //     //v2是调用过滤器传递的实参
        //     format_price(v,v2){
        //         return `${v2}${v/100}`;
        //     }
        // }
     });
    </script>
</body>

过滤器可以串联

{{ message | filterA | filterB }}
//filterA 被定义为接收单个参数的过滤器函数,表达式 message 的值将作为参数传入到函数中。然后继续调用同样被定义为接收单个参数的过滤器函数 filterB,将 filterA 的结果传递到 filterB 中。
<body>
    <div id ="app"> 
        <!-- type的第一个参数  是前面整个过滤器的结果 -->
        一碗烩面{{price|format_price('¥ ')|type('分')}}
    
    </div>
​
    <script>
     //创建Vue实例,得到 ViewModel
     var vm = new Vue({
        el: '#app',
        data: {
            price:2000,
            money:100
        },
        filters: {
            //v 是管道符最前面的第一个参数
            //v2是调用过滤器传递的实参
            format_price(v,v2){
                return `${v2}${v/100}`;
            },
            type(v,v3){
                return`${v}${v3}`;//$20分
            }
        }
     });
    </script>
</body>

Demo

需求说明 格式化的规则是当 月份、日期、小时等小于 10的时候,前面补上 0 对需要过滤的数据调用定义的规则进行处理,并返回处理之后的结果 使用mounted生命周期函数,每隔1s更新一下时间 使用beforeDestroy生命周期函数,在组件销毁前清除定时器

<body>
    <div id ="app"> 
        {{time}}
    </div>
​
    <script>
     //创建Vue实例,得到 ViewModel
     var vm = new Vue({
        el: '#app',
        data: {
            time:new Date(),
            timer:null
        },
        // 挂载后执行
        mounted () {
           this.timer =  setInterval(() => {
                this.time =  new Date();
            }, 1000);
        },
        // 组件销毁前执行
        beforeDestroy () {
            clearInterval(this.timer);
        }
     });
    </script>
</body>
<body>
    <div id="app">
        {{time|formart()}}
    </div>
​
    <script>
        //创建Vue实例,得到 ViewModel
        var vm = new Vue({
            el: '#app',
            data: {
                time: new Date(),
                timer: null
            },
            // 挂载后执行
            mounted() {
                this.timer = setInterval(() => {
                    this.time = new Date();
                }, 1000);
            },
            // 组件销毁前执行
            beforeDestroy() {
                clearInterval(this.timer);
            },
            //过滤器
            filters: {
                formart(date) {
                    let y =  date.getFullYear();       // 年
                    let m =  (date.getMonth() + 1)<10?'0'+(date.getMonth() + 1):(date.getMonth() + 1);  // 月
                    let day = date.getDate()<10?'0'+date.getDate():date.getDate();// 日
                    let h = date.getHours();          // 时
                    let min = date.getMinutes();      // 分
                    let s = date.getSeconds();       // 秒
​
                    return `${y}-${m}-${day} ${h}:${min}:${s}`
                }
            }
        });
    </script>
</body>
​