应将过滤器集中管理在src/filters/index.js中统一导出对象,再于main.js中遍历注册,避免散落维护困难;不可依赖动态导入,须显式import并确保注册在new vue前;过滤器需为纯函数,不依赖this、store或uni api。

main.js里塞满Vue.filter()太难维护
过滤器逻辑堆在main.js里,随着项目变大,注册代码会越来越长,改一个时间格式就容易牵连其他,而且无法复用、不好测试。这不是“写完能跑”就行的问题,是后续每次加新过滤器都要手动翻几十行、怕写错位置、怕漏掉Vue.filter()调用的长期负担。
把过滤器函数统一放到src/filters/index.js再批量导入
别新建一堆零散文件,就一个入口文件集中管理。这个文件只负责导出对象,不执行任何注册动作——注册仍由main.js控制,但变得干净可读。
- 在
src/filters/index.js中导出一个过滤器对象,键为过滤器名,值为函数:export default { formatDate: (value, format = 'yyyy-MM-dd') => { if (!value) return '' const d = new Date(value) if (isNaN(d.getTime())) return '' const year = d.getFullYear() const month = String(d.getMonth() + 1).padStart(2, '0') const day = String(d.getDate()).padStart(2, '0') if (format === 'yyyy-MM-dd') return `${year}-${month}-${day}` return d.toLocaleDateString('zh-CN') }, toUpper: (value) => value ? String(value).toUpperCase() : '' } - 在
main.js顶部 import 并遍历注册:import filters from './filters'
Object.keys(filters).forEach(key => { Vue.filter(key, filters[key]) }) - 确保这一步在
new Vue({ ... })之前,否则注册无效
为什么不能直接在filters/下放多个文件然后自动加载
uni-app(基于 Vue 2)没有模块扫描机制,require.context或import.meta.glob这类动态导入在小程序平台不可靠,H5 可能工作,但微信小程序编译期不支持运行时路径解析。硬搞会导致部分平台过滤器丢失,且调试困难。
- 显式
import+ 显式Vue.filter()是唯一稳定方案 - 如果真想多文件管理,可以拆成
src/filters/date.js、src/filters/string.js,但最终仍需在一个index.js里汇总导出,避免main.js里出现十几个import - 别在过滤器函数里写
uni.getSystemInfoSync()或this相关逻辑——它不在组件实例中运行,this是undefined
模板里链式调用多个过滤器时,注意它们都得是全局注册的
{{ timestamp | formatDate | toUpper }}看着简洁,但前提是formatDate和toUpper两个都进了Vue.filter()。漏注册任何一个,结果就是渲染为空,控制台还不会报错。
- 链式调用顺序严格:前一个输出是后一个输入,
toUpper接收到的是字符串,不是原始时间戳 - 带参数的过滤器如
{{ value | formatDate('MM/dd/yyyy') }},函数签名必须是(value, format),第一个value参数绝不能省略 - 高频使用(比如
v-for里)的过滤器,如果内部有正则或JSON.parse,建议提前在computed里处理好,别依赖模板实时计算
store或uni API。一旦写了uni.getStorageSync,小程序端会静默失败,H5 端可能报错,但错误位置指向模板而非过滤器文件。










