过滤器必须全局注册才能被模板中的 | 语法识别,Vue 2 中用 Vue.filter(),Vue 3 已移除该语法需改用计算属性或工具函数;statusText 应用字符串键兜底并避免空值报错。

过滤器必须在 Vue 实例上注册才能生效
直接在组件里写 filters 选项或用 computed 模拟过滤逻辑,都不能被模板中的 | 语法识别。UniApp(基于 Vue 2 或 Vue 3)的过滤器必须通过 Vue.filter() 全局注册,或在 Vue 3 的 app.config.globalProperties 上挂载(但注意:Vue 3 官方已移除过滤器语法支持,UniApp 当前仍兼容 Vue 2 模式,所以默认项目仍是 Vue 2 行为)。
常见错误是把过滤器写在 methods 里、或当成普通工具函数调用:{{ status | statusText }} 报错 “filter not found”,本质就是没注册。
- 确认项目是 Vue 2 模式(
vueVersion: '2'在vue.config.js或manifest.json中) - 过滤器定义必须在
main.js或入口文件中,且早于new Vue(...)执行 - 不要在
onLoad、created等生命周期里注册——太晚,模板已编译完毕
statusText 过滤器怎么写才安全
后端返回的数字状态码(如 0、1、2)转文字,核心是避免 undefined 导致渲染报错或空白。不能只写 return map[value],要兜底。
推荐写法:
Vue.filter('statusText', function(value) {
const map = {
'0': '正常',
'1': '待审核',
'2': '已拒绝',
'3': '已通过'
}
return map[value] || '未知状态'
})
- key 用字符串(
'0'),因为后端 JSON 解析后数字可能被当字符串传过来,类型不一致会导致匹配失败 - 不建议加第二个参数(如格式化选项),状态映射是确定性逻辑,参数只会增加调用时出错概率
- 如果状态语义随语言切换,不要硬编码中文,应读取
i18n字典,但过滤器内不建议直接调用this.$t(上下文不可靠)
模板里用错管道符位置会失效
{{ status | statusText }} 看似正确,但实际常踩坑的是:值为空、为 null、为 undefined,或绑定了响应式对象的深层属性但路径错误。
- 确保
status是顶层 data 属性,或已通过data()正确声明(比如data() { return { item: {} } },那就要写{{ item.status | statusText }}) - 不要在
v-for中对未初始化的项使用过滤器,例如v-for="item in list"但list初始为undefined,会触发Cannot read property '0' of undefined - 避免嵌套过深:如
{{ item.info.status | statusText }},若item.info为undefined,整个表达式会报错,应改用{{ (item.info?.status) | statusText }}(仅 Vue 3 支持可选链,Vue 2 不行,需提前判空)
Vue 3 项目里过滤器不可用怎么办
如果你用的是 Vue 3 + Composition API 的 UniApp 项目(vueVersion: '3'),Vue.filter 已被移除,| 语法不解析。此时必须换方案。
可行做法只有两个:
- 改用计算属性:
computed(() => statusMap[props.status] || '未知状态'),然后在模板中直接绑定该计算属性 - 封装成函数并导入使用:
<text>{{ getStatusText(item.status) }}</text>,其中getStatusText是从@/utils/status.js导入的纯函数
注意:不要试图在 setup() 里用 getCurrentInstance().proxy.$filters 模拟——UniApp 的 Vue 3 兼容层不保证该属性存在,且极不稳定。
最省事也最可靠的方式,是统一用一个导出函数,在需要的地方 import 调用。过滤器语法只是语法糖,底层逻辑不变,别为糖牺牲可维护性。


















