Vue封装全局过滤器Filters

通过封装vue全局过滤器实现filters的统一管理。
(PS:本文代码在vue-cli3构建的基础vue项目之上进行编写:vue create my-project

  在前后端分离的项目中,经常会有后台返回的数据需要经过处理才能显示到页面上的场景。

  使用最多的场景就是日期/时间、数字、字符串的格式化处理,实际业务中可能还有更复杂的数据处理逻辑。

  下面就拿封装全局的处理数字和字符串的 filter 来展示 vue 如何 封装全局filter 并统一处理。

一、定义/封装过滤器

  在 src目录 下新建 filters目录 用来专门存放全局过滤器,如果项目的过滤器过多,那么就要按类型分类。
  如果项目需要前台处理的数据不是太多,那么就在 filters目录 下新建一个 index.js 来存放所有的过滤器就足够了。

index.js代码如下:

// 封装过滤器
// 过滤器的声明可以有下列多种写法

/**
 * Number formatting by unit
 * like 10000 => 10k
 * @param {number} num
 * @param {number} digits
 * @return {string}
 */
function numberFormatter(num, digits) {
  const si = [
    { value: 1e18, symbol: "E" },
    { value: 1e15, symbol: "P" },
    { value: 1e12, symbol: "T" },
    { value: 1e9, symbol: "G" },
    { value: 1e6, symbol: "M" },
    { value: 1e3, symbol: "k" }
  ];
  for (let i = 0; i < si.length; i++) {
    if (num >= si[i].value) {
      return (num / si[i].value + 0.1).toFixed(digits).replace(/\.0+$|(\.[0-9]*[1-9])0+$/, '$1') + si[i].symbol
    }
  }
  return num.toString();
}

/**
 * Number formatting by thousand
 * like 10000 => "10,000"
 * @param {number} num
 * @return {string}
 */
const toThousandFilter = function(num) {
  return (+num || 0).toString().replace(/^-?\d+/g, m => m.replace(/(?=(?!\b)(\d{3})+$)/g, ','))
};

/**
 * Upper case first char
 * like "wenyuan" => "Wenyuan"
 * @param {string} string
 * @return {string}
 */
const uppercaseFirst = string => {
  return string.charAt(0).toUpperCase() + string.slice(1);
};

export default {
  numberFormatter,
  toThousandFilter,
  uppercaseFirst
};

二、注册过滤器

  然后在 main.js 中引入注册即可使用:

import filters from "./filters"; // global filters

// register global utility filters
Object.keys(filters).forEach(key => {
  Vue.filter(key, filters[key]);
});

vue_register_global_filters.png

三、在组件内使用写好的过滤器

  在组件中使用:

<template>
  <div class="home">
    <img alt="Vue logo" src="../assets/logo.png"/>
    <h1>score:{{ score | numberFormatter }}</h1>
    <h1>score:{{ score | toThousandFilter }}</h1>
    <h1>username:{{ username | uppercaseFirst }}</h1>
  </div>
</template>

<script>
export default {
  name: "home",
  components: {},
  data() {
    return {
      score: 1200000,
      username: "wenyuan"
    };
  }
};
</script>

四、效果

vue_use_global_filters_result.png

五、可能的报错与注意点

  在 main.js 中,要先定义过滤器, 再新建 vue 实例,否则会报Failed to resolve filter: xxx的错误。


参考
https://cn.vuejs.org/v2/guide/filters.html


  目录