uni-app 3.x 已彻底移除过滤器支持,{{ value | defaultnull }} 在任何平台都会失效——不是编译警告,而是静默不渲染或直接报错。

uni-app 3.x 已彻底移除过滤器支持,{{ value | defaultNull }} 在任何平台都会失效 —— 不是编译警告,而是静默不渲染或直接报错。
为什么 template 里写 {{ value | defaultNull }} 会空白或报错
Vue 3 废弃了 filters API,uni-app 3.x(即 @dcloudio/uni-app ≥3.0.0-alpha)完全跟随。即使你在 main.js 调用 Vue.filter,也会触发 TypeError: Vue.filter is not a function;模板中管道符 | 被编译器忽略,value 为 null 或 undefined 时直接渲染为空白,控制台无提示。
- 小程序平台(微信/支付宝)编译阶段就跳过过滤器解析,不报错也不生效
- H5 端可能短暂兼容,但升级后立即崩,不可依赖
- 所谓“局部 filters 选项”在
setup语法下根本无法声明,export default写法也因 uni-app 3 的编译规则被忽略
替代方案:用 computed 封装单字段默认值
对页面内某个字段做兜底,比如 item.title 可能为 null,直接在 setup 里定义计算属性:
const formattedTitle = computed(() => {
return props.item?.title ?? '无标题'
})
-
??只拦截null和undefined,保留0、false、''原值,适合标题、ID 等字段 - 若需把空字符串也转成占位符,改用
||,但注意0 || '–'会变成'–',金额类字段慎用 - 不要在
computed里调用uni.showToast或发起请求 —— 它只该返回值,不能有副作用
批量处理:在 request 层统一清洗后端数据
比每个页面写 computed 更彻底的方式,是在请求响应拦截器中递归替换 null 和 undefined:
// utils/request.js
axios.interceptors.response.use(res => {
const cleanData = deepReplaceNull(res.data, '')
return { ...res, data: cleanData }
})
- 自己实现
deepReplaceNull,用typeof判断对象/数组,避免误伤Date、RegExp等类型 - 别用
JSON.parse(JSON.stringify(obj))—— 它会丢掉函数、undefined、循环引用,且对NaN返回null - 清洗后,
item.author?.name这种链式访问不再报错,v-model绑定也不会因null触发组件校验失败(如uni-data-select要求数组却收到null)
容易被忽略的边界:空字符串 '' 和 null 语义不同,但 UI 层常要统一展示
后端返回 null 表示「未填写」,返回 '' 可能表示「填了空格」,两者在业务上不该等价。但 UI 层往往都显示 '–' 或占位图,这时不能只靠 ??:
- 图片地址字段建议组合判断:
item.cover || item.default_cover || '/static/placeholder.jpg' - 文本类字段若需模糊兜底,用
||,但必须加类型防护:typeof item.desc === 'string' ? (item.desc.trim() || '–') : '–' - 金额字段绝不能用
|| '0.00',否则price: 0会变字符串,后续+ price得到'0.000'











