qq小程序完全不支持vue过滤器语法,模板中使用|管道符会编译报错;必须用computed或methods替代,如formattedtitle()或formatdate(),并在模板中直接调用。

QQ小程序不支持 Vue 过滤器语法
QQ 小程序(mp-qq)运行时基于自研渲染引擎,**完全不支持 Vue 2 的 | 过滤器语法**,哪怕你在 H5 或微信小程序能跑通,QQ 小程序里写 {{ value | formatName }} 会直接编译报错,错误信息类似:Parse error: Unexpected token | 或模板解析失败白屏。
这不是配置或写法问题,是平台能力缺失——QQ 小程序的模板编译器根本不识别管道符,也不会调用 Vue.filter 注册的函数。
- 全局过滤器
Vue.filter("xxx", fn)在 QQ 小程序中无效,main.js 里注册了也无响应 - 组件内
filters: { }选项会被忽略,不会触发任何函数 - 连最基础的
{{ "abc" | uppercase }}都无法通过模板编译
v-if / :class / :style 中嵌套过滤器必然失败
在 QQ 小程序中,所有指令绑定值都走纯 JS 表达式解析,v-if="item.type | typeText"、:class="status | statusClass" 这类写法不仅逻辑错误,更会在编译阶段直接中断,导致整个页面无法加载。
-
v-if只接受布尔表达式,|是非法运算符,不是语法糖 -
:class和:style在 QQ 小程序中仅支持简单对象或字符串,不支持带管道符的表达式 - 试图用
"{{ item.name | upper }}"拼字符串传入属性,会因双大括号被当作文本节点而失效
必须用计算属性或方法替代过滤逻辑
把原本想塞进模板的过滤行为,提前到响应式层处理。这是唯一稳定、跨平台、可调试的方案。
- 对单个值:写一个
computed,例如formattedTitle() { return this.rawTitle?.toUpperCase() || "" },然后模板里用{{ formattedTitle }} - 对列表项:在
data或onLoad中预处理,this.list = res.data.map(i => ({ ...i, displayStatus: i.status === 1 ? "已支付" : "未支付" })) - 需要复用的格式化逻辑:抽成普通方法,如
formatDate(date) { return date ? new Date(date).toLocaleDateString() : "" },再在模板中调用{{ formatDate(item.time) }}(注意:QQ 小程序允许模板中调用方法,但不能含副作用)
别踩“兼容写法”的坑
有人尝试用条件编译 #ifdef MP-QQ 包裹过滤器调用,或给 QQ 小程序单独写一个空 filters 对象,这些都没用——模板语法层面已被编译器拒绝,根本到不了运行时。
- 不要在
computed里调用uni.showToast或发起请求,这会导致响应式依赖混乱 - 方法中做
JSON.stringify或new Date()时,务必加if (!date) return ""防御,QQ 小程序对NaN和Invalid Date更敏感 - 如果项目同时支持 H5/微信/QQ,过滤器代码必须彻底删除,不能留“备用”,否则 QQ 平台构建会失败
computed 或 methods 中——看似多写几行,实则换来可维护性和全平台稳定性。











