Vue过滤器链从左到右执行,如{{value|filterA|filterB}}等价于filterB(filterA(value)),需提前注册、避免参数表达式、注意null/undefined传递及性能问题。

直接在模板里用 | 连续链式调用就行,但要注意执行顺序和参数传递是否符合预期——过滤器是从左到右依次执行的,前一个的输出是后一个的输入。
多个过滤器连用的语法和执行顺序
Vue 的过滤器链是左结合的,{{ value | filterA | filterB }} 等价于 filterB(filterA(value))。比如格式化时间再截取前10位:{{ timestamp | formatDate | slice(0, 10) }},这里 slice 必须是已注册的过滤器(不能直接用 JS 原生方法)。
- 所有过滤器必须提前全局注册或局部声明,否则运行时会静默失败(控制台无报错,但渲染为空)
- 带参数的过滤器,括号内写死值或用
data中的响应式字段,不支持表达式如{{ value | filterA(item.id + '_suffix') }} - 如果某个过滤器返回
null或undefined,后续过滤器会收到该值,可能引发 TypeError
全局过滤器 vs 局部过滤器混用的注意事项
全局过滤器(在 main.js 用 Vue.filter() 注册)对所有页面生效;局部过滤器只在当前 .vue 文件的 filters 选项中定义。两者可以共存,但同名时局部会覆盖全局。
- 避免命名冲突:比如全局有
price,页面又定义了同名局部过滤器,那这个页面就用不到全局版了 - 局部过滤器无法被其他页面复用,想跨页面共享逻辑,必须提成全局或抽成工具函数再封装成过滤器
- 调试时注意作用域:H5 端能通过
Vue.options.filters查看全局列表,小程序端需靠 console.log 打点确认是否注册成功
常见错误:链式调用中传参失效或结果异常
最典型的是把带参数的过滤器写成 {{ value | filterA('a', 'b') | filterB }} ——这在 Vue 2(uni-app 当前基础)中是非法语法,编译阶段就会报错 Invalid expression。
- 正确写法是把多参数过滤器设计为接收一个对象,例如:
{{ value | mergeOptions({ type: 'list', size: 20 }) }} - 或者拆成单参数过滤器组合,如
{{ value | withType('list') | withSize(20) }} - 如果过滤器内部做了副作用(如发请求、改全局状态),链式调用会让行为更难追踪,建议纯函数化
真正容易被忽略的是:过滤器在 v-for 循环里高频调用时,没有缓存机制,每次渲染都重新执行。数值类转换影响不大,但涉及正则匹配、JSON 解析或复杂条件判断的,建议提前在 computed 或 data 初始化阶段处理好,别全堆在模板里。


















