vue.filter 仅在 h5 端生效,小程序和 app 端因 json 数据驱动机制不解析管道语法,导致 {{ date | formatdate }} 原样输出;应改用工具函数或 computed 替代,并注意跨端 api 兼容性。

Vue.filter 在真机上根本不会执行
不是你写错了,是 uni-app 的跨端编译机制决定的:Vue.filter 只在 H5 端被 template 编译器识别并处理;小程序(微信/支付宝/字节)和 App 端使用 JSON 数据驱动 + 自定义组件树,| 管道语法压根不进解析流程——模板里写 {{ date | formatDate }},真机上就原样输出字符串,不报错、不警告、也不调用函数。
常见真机失效现象
这些表现都指向同一个底层原因:
-
{{ timestamp | formatDate }}在微信开发者工具里显示正常,真机扫码后变成NaN-NaN-NaN或空字符串 - 支付宝小程序构建后,过滤器调用完全消失,控制台查不到任何 warning
- iOS 真机上日期显示为
2022-3-2(实际是误用了getDay()而非getDate()),但 H5 端没暴露这个 bug
跨端可用的替代方案
放弃 Vue.filter,改用显式函数调用或计算属性:
- 在
@/utils/filters.js中导出纯函数:export const formatDate = (date) => { if (!date) return '' const d = new Date(date) return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}` } - 在页面 setup 中直接调用:
const formattedDate = formatDate(item.createTime) - 需要模板中绑定?用
computed:const displayDate = computed(() => formatDate(props.item.time)) - 金额类场景别手写正则,优先用
Intl.NumberFormat实例(微信基础库 2.19.0+、支付宝 10.2.80+ 均支持)
为什么 H5 能跑通反而更危险
H5 端能运行会掩盖两个关键问题:
- iOS Safari 对
new Date('2022-03-08')解析不稳定,真机可能返回Invalid Date,但 H5 开发者工具常默认用 Chrome 内核,表现正常 - 过滤器函数里如果用了
window、document或其他 Web API,在小程序和 App 端会静默失败,H5 却照常工作 - 路径大小写、static 文件名含中文等 H5 容忍的问题,在 iOS 真机上直接导致资源加载失败,进而让依赖过滤器格式化的数据源(如时间戳转字符串后拼进图片 URL)连带崩溃











