局部过滤器需在export default中定义filters对象,函数必须接收value参数并做空值判断,如filters: { formatsex(value) { if (value == null) return '未知'; const map = {'0': '女', '1': '男'}; return map[string(value)] || '未知' } }。

直接用 filters 对象定义局部过滤器,或在 main.js 中通过 Vue.filter() 注册全局过滤器——但必须保证函数签名是 (value, ...args),且第一个参数 value 不可省略,否则模板中 {{ sex | formatSex }} 会渲染出 undefined。
局部过滤器怎么写才不丢值
在页面的 export default 里直接写 filters 对象,函数必须接收第一个参数 value(即模板传入的原始值),再做映射:
- 后端返回
"0"、"1"字符串最常见,也可能是数字0、1,所以建议统一转字符串再查表 - 没匹配到时要给默认值(比如
"未知"),避免空渲染 - 别写成箭头函数漏掉
value,例如formatSex: () => {...}是错的
filters: {
formatSex(value) {
const map = { '0': '女', '1': '男' }
return map[String(value)] || '未知'
}
}
全局过滤器注册为什么总不生效
只新建 filters/index.js 文件、导出函数,但不在 main.js 里调用 Vue.filter(),就完全不会工作——uni-app 不扫描文件,也不自动加载。
-
main.js必须在new Vue(...)之前 import 并注册,例如:import { formatSex } from '@/filters'→Vue.filter('formatSex', formatSex) - 函数签名必须是
(value, ...args),哪怕不用额外参数,也不能省略value - 不能在
App.vue的created或页面onLoad里注册,此时 Vue 构造函数已初始化完毕,注册无效
模板里怎么用才不出错
确保绑定的数据类型和过滤器预期一致,尤其注意空值、null、undefined 传入后可能让 String(null) === "null",导致查不到映射。
- 推荐在过滤器内部先做基础判断:
if (value == null) return '未知' - 模板中直接写
{{ item.sex | formatSex }},不要加括号、不要传参(除非你定义了第二个参数) - 如果后端字段名不统一(如
gender、sex、user_sex),过滤器本身不解决字段名问题,得靠数据层归一化或组件内computed
跨平台时容易被忽略的点
过滤器函数运行在所有平台(H5 / 微信小程序 / App / 鸿蒙元服务),但它没有 this、没有 uni、没有 document,纯同步纯函数。
- 不能在过滤器里调用
uni.getSystemInfoSync()或发请求 - 不能依赖组件内的
data或props,它只收模板传进来的值 - 如果需要动态翻译(比如多语言),得把语言 locale 作为第二个参数传入,再在过滤器里查对应语言的映射表
{{ sex | formatSex }} 都会静默渲染为空白,连报错都没有。










