标签
HTML
正则表达式
Json
包管理工具
vite
CSS
XPath
JavaScript
Jquery
less
ES6
Vue
React
vue 3
Layui
editor.md
sea.js
Zepto.js
mysql.js
mssql.js
NodeJs
Express
前端template
YAML
杂项
外部链接
Vue公有和私有过滤器

1、公有过滤器

定义:Vue.filter('过滤器名称', function (dataStr, ……) {})

Vue.filter有两个参数,第一个是过滤器的名称,第二个是一个函数,函数的第一个参数是使用过滤器本身这个数据,之后还可以定义多个形参

调用方式:{{ msg | 过滤器名称1(形参……) }}

2、私有过滤器

定义:filters{'过滤器名称1':function (dataStr, ……) {},'过滤器名称2':function (dataStr, ……) {}}

私有过滤器放在vue实例的filters属性中,filters里面可以定义多个私有过滤器,私有过滤器函数的参数和公有过滤函数一样

调用方式:{{ msg | 过滤器名称1(形参……) }}

示例代码如下:这个示例是一个时间格式标准显示的过滤器,运行下面的代码在控制台中会一个错误

[Vue warn]: Failed to resolve filter: timeFormat

这是因为我们在app的vue作用域中去调用了app2的vue作用域中的私有过滤器,错误也证明了私用过滤器是不能给外部调用的。

<html>
<hred>
    <meta charset="utf-8">
    <meta name="viewport"
        content="width=device-width,user-scalable=no,initial-scale=1.0, maximun-scale=1.0, minimun-scale=1.0">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/4.5.3/css/bootstrap.min.css">
    <script src="https://cdn.bootcss.com/vue/2.5.2/vue.js"></script>
</hred>
<div id="app">
    <h4>{{nowDate}}</h4>
    <h4>{{nowDate | datetimeFormat}}</h4>
    <h4>{{nowDate | datetimeFormat('yyyy-mm-dd hh:mm:ss')}}</h4>
    <h4>{{nowDate | timeFormat}}</h4>
</div>
<hr />
<div id="app2">
    <h5>{{new Date() | datetimeFormat('yyyy-mm-dd hh:mm:ss')}}</h5>
    <h5>{{new Date() | timeFormat}}</h5>
</div>
<script type="text/javascript">
    Vue.filter('datetimeFormat', function (dateStr, pattern = "yyyy-mm-dd") {
        var dt = new Date(dateStr)
        var y = dt.getFullYear()
        var m = (dt.getMonth() + 1).toString().padStart(2, '0')
        var d = dt.getDay().toString().padStart(2, '0')
        if (pattern.toLowerCase() == "yyyy-mm-dd") {
            return `${y}-${m}-${d}`
        } else {
            var hh = dt.getHours().toString().padStart(2, '0')
            var mm = dt.getMinutes().toString().padStart(2, '0')
            var ss = dt.getSeconds().toString().padStart(2, '0')
            return `${y}-${m}-${d} ${hh}:${mm}:${ss}`
        }
    })
    var vm = new Vue({
        el: "#app",
        data: {
            nowDate: new Date()
        },
        methods: {}
    })
    var vm2 = new Vue({
        el: "#app2",
        filters: {
            datetimeFormat: function (dateStr, pattern = "yyyy-mm-dd") {
                var dt = new Date(dateStr)
                var y = dt.getFullYear()
                var m = (dt.getMonth() + 1).toString().padStart(2, '0')
                var d = dt.getDay().toString().padStart(2, '0')
                return `${y}-${m}-${d}`
            },
            timeFormat: function (timeStr) {
                var dt = new Date(timeStr)
                var hh = dt.getHours().toString().padStart(2, '0')
                var mm = dt.getMinutes().toString().padStart(2, '0')
                var ss = dt.getSeconds().toString().padStart(2, '0')
                return `${hh}:${mm}:${ss}`
            }
        }
    })
</script>

</html>

3、其它知识点

①模板字符串:`${y}-${m}-${d} ${hh}:${mm}:${ss}`有些繁琐的字符拼接我们可以使用模板字符串来简化它,比如示例中的日期格式,用${变量}定义模板,模板要用``符号包裹,注意不是单引号''哦!

②toUpperCase() 将字符串全部变成大写和 toLowerCase() 将字符串全部变成小写

③padStart() ES6中新增的方法,补全字符串的位数,示例中padStart(2,'0')表示的就是这个字符串有两位,如果不满两位就用'0'往前补全,padEnd(2,'0')则是往后用'0'补全

④在ES6中函数的参数是可以给定默认值的,在 function (dateStr, pattern = "yyyy-mm-dd") 中我们就给形参 pattern 添加了默认值"yyyy-mm-dd"

⑤两个vue实例中的数据、方法、属性是不能相互调用的

⑥如果私有过滤器和公有过滤器的名称相同的话,优先调用的是私有过滤器

⑦js中获取日期的月份是从0开始的,所以显示日期时记得要加1


扫一扫手机看
点击排行
订阅号
...