过滤器必须通过 Vue.filter() 注册才能在模板中使用 |,挂载到 Vue.prototype 上无效;JS 中调用需挂载到 prototype,两者机制不同,须分开注册。

过滤器不能挂载到 Vue.prototype 上
直接把过滤器函数赋值给 Vue.prototype 是无效的。比如写 Vue.prototype.$formatDate = function(value) { ... },然后在模板里写 {{ date | $formatDate }},这不会触发任何效果——Vue 的管道语法 | 只识别通过 Vue.filter() 注册的函数,和 prototype 完全无关。
为什么有人会想挂到 prototype 上?
常见混淆点来自两类需求混用:
- 想在 JS 逻辑里调用(如
this.$formatDate(date))→ 这确实该挂Vue.prototype - 想在 template 里用管道符(如
{{ date | formatDate }})→ 这必须走Vue.filter()
两者注册机制、调用时机、执行上下文都不同,不能互相替代。强行合并只会让一个失效,甚至两个都出错。
正确做法:分开注册,各司其职
如果你既需要模板管道,又需要 JS 方法调用,就分别注册,别试图“一鱼两吃”:
递归分析 Vue 项目组件依赖,从入口文件生成组件层级图,支持 Vue 2/3,输出组件名、文件路径和属性。适用于分析组件结构、排查依赖或了解项目架构。
立即学习“前端免费学习笔记(深入)”;
-
Vue.filter('formatDate', (value, format) => { ... })→ 模板里用{{ date | formatDate('yyyy-MM-dd') }} -
Vue.prototype.$formatDate = function(date, format) { ... }→ JS 里用this.$formatDate(date)
注意:两个函数体可以复用同一段逻辑(比如抽成工具函数),但注册入口必须分开。别在 Vue.filter 里调用 this.$formatDate —— 过滤器里没有 this,会报 undefined。
容易被忽略的兼容性雷区
uni-app 当前主流仍是 Vue 2(@dcloudio/uni-app 版本 Vue.filter 有效;但如果你已升级到 Vue 3 支持版本(如为 Harmony Next 编译),Vue.filter 会直接报错,且 Vue.prototype 挂载方式也失效(需改用 app.config.globalProperties)。检查方式很简单:console.log(uni.getSystemInfoSync().platform) 或翻 package.json 里的 @dcloudio/uni-app 版本号。

















