uni-app 中 vue.filter 仅 h5 支持,小程序和 app 端完全不执行;跨端应改用工具函数或计算属性,如 tolower(val) 替代 {{ val | tolower }},确保逻辑统一可控。

uni-app 里全局过滤器不生效,不是你写错了,是它在小程序和 App 端根本不会执行——Vue.filter 只对 H5 有效,其他平台编译器直接跳过 | 语法,连函数入口都进不去。
为什么 Vue.filter 在微信/支付宝/字节小程序里完全没反应
小程序端用的是 JSON 数据驱动 + 自定义组件树,模板里的 {{ value | myFilter }} 不会被解析成 JS 调用,而是原样透传或静默丢弃。你看到的“没变化”,其实是框架压根没跑你的函数。
- 真机调试时控制台无报错、无 warning,只显示原始值或空字符串
-
main.js里写了Vue.filter('toUpper', ...),H5 正常,小程序依然无效 - Vue 3 模式(uni-app 3.x)已彻底移除
Vue.filterAPI,连 H5 都不支持 - App 端(iOS/Android)同样不支持,因底层渲染引擎未实现 filter 管道机制
跨端生效的替代方案:用计算属性或工具函数代替
把逻辑从模板层挪到 JS 层,由你主动调用,才能确保所有平台走同一段代码路径。
- 在
setup()或methods中定义纯函数:const toLower = (str) => typeof str === 'string' ? str.toLowerCase() : '' - 展示场景直接调用:
{{ toLower(item.name) }}(注意:不是{{ item.name | toLower }}) - 表单绑定需配合
@input手动更新::value="toLower(formData.text)" @input="e => formData.text = e.detail.value" - 避免在 computed 中做副作用(如
uni.showToast),也别依赖this上下文
如果非要复用逻辑,封装工具函数比注册 filter 更可靠
新建 utils/format.js,导出命名函数,按需引入,不依赖任何框架生命周期。
- 统一处理边界:
export const toLower = (val) => String(val || '').toLowerCase() - 金额转元示例:
export const centsToYuan = (cents) => Number(cents) / 100 || 0 - 千分位格式化优先用
(num || 0).toLocaleString('zh-CN'),比手写正则更稳 - 禁止在工具函数里调
uni.requireNativePlugin或异步操作——过滤器必须同步返回
最易被忽略的一点:哪怕你在 H5 调通了 Vue.filter,只要项目要上小程序,这段代码就等于没写。跨端一致性的起点,从来不是“怎么写 filter”,而是“根本不该用 filter”。










