uni-app 3.0+(Vue 3)已移除过滤器,main.js 中无法注册;应改用工具函数挂载为全局方法(如 app.config.globalProperties.$formatPrice),模板中调用 {{ $formatPrice(price) }}。

uni-app 的 main.js 不支持全局过滤器注册
uni-app 从 3.0 开始(基于 Vue 3)已彻底移除过滤器(filters)语法,main.js 中调用 app.filter() 或类似方式会直接报错或静默失效。这不是配置问题,而是 Vue 3 的底层设计变更——过滤器被函数式工具替代。
替代方案:统一封装为可复用的工具函数 + 在模板中用方法调用
你需要放弃「注册过滤器」的思路,转而把原有过滤逻辑抽成独立函数,再通过 app.config.globalProperties 挂载为全局方法(注意:不是过滤器),模板中改用 {{ formatPrice(price) }} 这种调用方式。
-
main.js中导入并挂载:
// main.js
import { createSSRApp } from 'vue'
import App from './App.vue'
import { formatPrice, formatDate, toUpperFirst } from './utils/filters'
<p>export function createApp() {
const app = createSSRApp(App)
// 挂载为全局方法(非过滤器)
app.config.globalProperties.$formatPrice = formatPrice
app.config.globalProperties.$formatDate = formatDate
app.config.globalProperties.$toUpperFirst = toUpperFirst
return {
app
}
}- 组件中使用时,需通过
this.访问(仅 Options API);Composition API 中推荐直接import使用,更可控、tree-shakable - 挂载名(如
$formatPrice)建议加$前缀,避免与 data / props 冲突
如果项目还在用 Vue 2 版 uni-app(≤2.9.x),仍可用 Vue.filter
仅限旧版(确认 uni-app CLI 版本和 @dcloudio/uni-app 依赖为 2.x)。此时可在 main.js 中批量注册:
// main.js(仅 Vue 2 版 uni-app)
import Vue from 'vue'
import * as filters from './filters' // 导出为 { formatPrice: ..., formatDate: ... }
<p>Object.keys(filters).forEach(key => {
Vue.filter(key, filters[key])
})- 必须确保
filters模块导出的是纯函数,且第一个参数为待处理值 - 不支持 Composition API 中的
setup()内直接使用过滤器,模板里仍写{{ price | formatPrice }} - 升级到 Vue 3 后这段代码会完全失效,且 HBuilderX 新建项目默认启用 Vue 3
容易忽略的关键点:H5 与小程序平台的行为差异
即使在 Vue 2 版 uni-app 中,过滤器在不同平台表现也不一致:
- H5 端:正常工作
- 微信小程序(使用
uni-app编译为 wxml):部分复杂过滤器(含闭包、this 引用、异步逻辑)会被编译忽略或报filters is not defined - App 端(nvue):不支持过滤器,必须用方法调用
- 结论:跨平台项目里,别依赖过滤器,尤其不要在 nvue 页面里写
|语法
最稳妥的做法,是从第一天起就用工具函数 + 显式调用,不碰 filter 这个词。


















