根本原因是微信小程序原生不支持 Vue 2 的 filters 语法,uni-app 编译到 mp-weixin 时直接忽略 filters 配置,导致模板中 {{ value | formatTime }} 报错或为空;应改用 methods、computed 或工具函数替代。

uni-app 微信小程序中 filters 报 undefined 的根本原因
微信小程序原生不支持 Vue 2 的 filters 语法,uni-app 编译到 mp-weixin 平台时,会直接忽略 filters 配置项——它压根不会被挂载到运行时上下文中。所以你在 WXML 里写 {{ value | formatTime }},控制台报 formatTime is not defined 或渲染为空,不是漏写了、没注册,而是这个机制在小程序端根本不存在。
替代方案:用计算属性或方法代替 filters
不能用过滤器,就改用更可控、更明确的写法。关键不是“怎么复现过滤器”,而是“怎么让逻辑可读、可调试、不触发 undefined”。
- 模板中直接调用方法:
{{ formatTime(value) }},并在methods中定义该函数 - 对简单、复用多的格式化逻辑,封装为工具函数(如
/utils/date.js),然后import { formatTime } from '@/utils/date'后在methods或computed中使用 - 避免在
v-for列表中高频调用复杂函数;若性能敏感,优先用computed预处理整个数组 - 注意:方法内不要依赖
this异步状态(比如data还未赋值),否则可能返回undefined或空字符串
如果坚持用类 filters 写法,必须手动挂载到 this
这不是推荐做法,但某些老项目迁移时可能想最小改动。你得放弃声明式写法,改为在 created 或 beforeCreate 中把函数挂到实例上:
export default {
created() {
this.$options.filters = this.$options.filters || {}
this.$options.filters.formatTime = (val) => {
return val ? new Date(val).toLocaleString() : ''
}
},
methods: {
// 仍需手动调用,WXML 不识别 {{ x | f }},只能 this.$options.filters.formatTime(x)
}
}
⚠️ 注意:this.$options.filters 在小程序平台不会自动生效于模板,仅可用于 JS 层手动调用;且 H5 端能用,小程序端不能,会造成多端行为不一致。
容易被忽略的坑:编译条件与平台差异
很多人在 main.js 或 App.vue 里全局注册了 Vue.filter,结果只在 H5 生效,小程序完全无反应——因为 uni-app 的 mp-weixin 编译器根本不解析 Vue.filter 调用。
- 检查是否误用了
Vue.filter(仅 H5 有效) - 确认
manifest.json中"mp-weixin"节点存在且配置合法,否则部分编译逻辑可能降级异常 - 若使用 Composition API(
setup),filters本身就不被支持,连 H5 都不行,必须用ref/computed替代 - 真机调试时,微信开发者工具基础库版本低于 2.10.0 可能加剧兼容问题,建议锁定 2.16.0+ 测试
最稳妥的做法,是从第一天起就把格式化逻辑写成独立函数,而不是依赖平台不可靠的语法糖。undefined 不是偶然,是编译目标明确拒绝了它。



















