vue过滤器模块

2021-06-24  本文已影响0人  误入IT的人

本文将介绍一下实际项目中过滤器一种定义方式,不局限于这一种方式。

在成熟的项目中过滤器的使用很频繁,局部过滤器一般不建议使用,我们使用全局过滤器,将过滤器的实现抽出来变成全局过滤器,方便复用。

使用Vue CLI创建demo工程,然后在src目录下创建过滤器模块,创建完成后的工程目录结构如下:


DateFilter.js

/**
 * 传入的数据格式为:20210625
 * 传出的数据格式为:2021-06-25
 */
const filter = function (input) {
    //过滤器的业务逻辑
    if (input) {
      return input.substring(0, 4) + '-' + input.substring(4, 6) + '-' + input.substring(6);
    }
}

let filterObj = {}
//确保filterObj的属性(DateFilter)需要与当前文件名保持一致
filterObj.DateFilter = filter
export default filterObj

PhoneFilter.js

/**
 * 传入的数据格式为:18811996654
 * 传出的数据格式为:188****6654
 */
const filter = function (input) {
    if (input) {
      return input.substring(0, 3) +'****'+ input.substring(7, 11);
    }
}

let filterObj = {}
//确保filterObj的属性(PhoneFilter)需要与当前文件名保持一致
filterObj.PhoneFilter = filter
export default filterObj

以上代码展示了DateFilter(日期格式化过滤器)和PhoneFilter(手机号脱敏过滤器)文件内部的逻辑,注意点就是filterObj对象的唯一属性名字需要跟当前js文件同名,这样便于批量导入。一个过滤器js文件只能有一个过滤器。

filter文件夹下的index.js实现过滤器批量导入与注册

import Vue from 'vue'
//使用webpack中require.context批量导入
const files = require.context('./filters', true, /\.js$/)
files.keys().forEach(fileName => {
    var obj = files(fileName).default;
    var filterName = fileName.replace('./', "");
    filterName = filterName.replace('.js', "");
    if(obj[filterName] === undefined){
        console.warn("过滤器文件名和过滤器方法名应保持一致",fileName);
    }else{
        //全局注册过滤器
        Vue.filter(filterName, obj[filterName]);
    }
})

main.js引入所有过滤器

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

//导入所有过滤器
import './filter'


Vue.config.productionTip = false

new Vue({
  render: h => h(App),
}).$mount('#app')

页面使用
为了简单,我直接在App.vue文件里面演示一下过滤器的使用。App.vue代码如下:

<template>
    <div id="app">
        <div>过滤器演示</div>
        <div>时间过滤器 {{date | DateFilter}}</div>
        <div>手机号过滤器 {{phone | PhoneFilter}}</div>
    </div>
</template>

<script>
    export default {
        data() {
            return {
                date: '20210625',
                phone: '18811907765'
            }
        },
        name: 'App'
    }
</script>

<style>
    #app {
        font-family: Avenir, Helvetica, Arial, sans-serif;
        -webkit-font-smoothing: antialiased;
        -moz-osx-font-smoothing: grayscale;
        text-align: center;
        color: #2c3e50;
        margin-top: 60px;
    }
</style>

实现效果

错误记录
https://www.jianshu.com/p/9a6965a14c2a
参考
https://www.w3school.com.cn/jsref/jsref_obj_regexp.asp
https://zhuanlan.zhihu.com/p/59564277
https://www.cnblogs.com/ll15888/p/11904707.html
https://www.cnblogs.com/Guorisy/p/12389347.html

上一篇 下一篇

猜你喜欢

热点阅读