vue 3 彻底移除了 vue.filter api 及模板中 | 过滤器语法,uni-app 3.x 同步废弃;需将过滤逻辑迁移至 js 层,用工具函数或 computed 替代,正则批量替换 {{ value | fn }} 为 {{ fn(value) }}。

Vue 3 里 Vue.filter 直接报错,不是配置问题,是 API 被删了
升级到 Vue 3 后,Vue.filter("xxx", fn) 会抛出 TypeError: Vue.filter is not a function —— 这不是你写错了路径或时机,而是 Vue 官方在 3.0 中彻底移除了这个 API。uni-app 3.x 版本(对应 @dcloudio/uni-app ≥ 3.0.0-alpha)完全跟随 Vue 3 行为,不存在“开启开关”或“编译选项”能恢复过滤器。
模板中 {{ value | formatTime }} 全量失效,别指望编译器兼容
即使你在 Vue 2 项目里用得好好的,一升级 Vue 3,所有带 | 的插值表达式都会静默退化为原始值(比如 {{ null | formatDate }} 渲染成空字符串,而不是调用函数)。小程序平台(微信/支付宝/快应用)压根不识别该语法,H5 端也会因解析失败而跳过处理。这不是 bug,是编译器主动忽略。
- 检查方式:打开浏览器控制台,搜索
formatDate,如果没定义且没报错,大概率是被跳过了 - 别试
v-bind:title="value | formatTime"—— 模板里所有|都无效 - 局部
filters: { }选项在 Vue 3 组件中也完全不生效
一键替换方案:用 defineComponent + computed 或工具函数封装
没有“一键全局替换过滤器”的魔法脚本,但可以用编辑器正则批量改写核心逻辑,再辅以少量手动收口。关键不是改模板,而是把过滤逻辑从模板层提到 JS 层。
使用 `@ainative/vue-sdk` 为 Vue 3 应用添加 AI 聊天功能。适用于以下场景:(1) 安装 `@ainative/vue-sdk`,(2) 在 Vue 组件中使用 `useChat` 组合式函数,(3) 提供……
- 日期/数字类通用格式化:统一抽成工具函数,例如
import { formatDate } from "@/utils/format",模板中改写为{{ formatDate(item.time) }} - 字段兜底(如
item.name || "–"):直接替换成{{ item.name ?? "–" }},现代 JS 支持,所有平台都认 - 枚举映射类(如 status → 中文):在
setup()里用computed或const statusText = computed(() => STATUS_MAP[item.status] || "未知") - 正则批量替换建议(VS Code):
{{\s*([^|}]+)\s*\|\s*([a-zA-Z0-9_]+)\s*}}→{{ $2($1) }},然后逐个确认函数是否存在、入参是否需调整
最容易被忽略的坑:uView / uni-ui 等组件库里的 filter 调用
很多老项目在 main.js 里给 Vue.prototype.$filter 或 Vue.config.globalProperties.$filter 挂了方法,然后在 uView 的 u-cell、u-form 等组件属性里写 :title="value | uppercase"。这些调用在 Vue 3 下全部失效,且不会报错 —— 因为组件内部是用 this.$filter?.uppercase 访问的,而 this.$filter 已是 undefined。
必须手动检查 node_modules/uview-ui(或你用的 UI 库)源码中是否含 | 语法或 $filter 调用,若有,要么降级使用兼容版(如 uView 3.x),要么 fork 后改造成 props 传入格式化函数。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!









