uni-app 3.x 不支持过滤器,需用计算属性或方法处理图片空路径,并配合 @error 处理加载失败,同时占位图须为本地静态资源且设置固定宽高。

uni-app里不能用过滤器处理图片空路径
过滤器(filters)在 Vue 2 中已废弃,uni-app 3.x 基于 Vue 3,**根本不支持全局或局部过滤器**。试图写 {{ url | defaultImage }} 会直接报错或静默失效,不是语法问题,是框架层面移除了该能力。
替代方案:用计算属性或方法返回安全图片路径
真正稳定、可维护的做法是把路径逻辑收口到 JS 层,避免模板里做判断。常见错误是直接在 v-if 或三元表达式里硬写默认图,导致重复逻辑、无法复用、@error 失效。
- 推荐用计算属性:
computed: { displayUrl() { return this.imageUrl || '/static/placeholder.png' } },然后:src="displayUrl" - 如果需区分「空字符串」「null」「undefined」或「非法 URL」,用方法更灵活:
getSafeImage(url) { return url && typeof url === 'string' && url.trim() ? url : '/static/placeholder.png' } - 注意:不要在方法里调用
require()—— 它只接受静态字符串,动态拼接路径会编译失败
@error + 动态 fallback 才能覆盖加载失败场景
计算属性只能兜底空路径,但网络 404、CDN 返回异常、临时路径过期等真实失败情况,@error 是唯一可靠入口。很多人只设 placeholder,却没处理 @error,结果首屏看着正常,断网一刷就留白。
-
@error触发时,this.imageUrl还是原值,必须手动赋值:this.displayUrl = '/static/error.png' - 别直接改原始
imageUrl变量,否则重试逻辑会被污染;建议用独立响应式字段(如displayUrl)控制最终渲染源 - 真机测试时,模拟器常不触发 @error,务必在断网环境下验证
占位图本身也要可控,否则引发二次闪烁
placeholder 图片如果尺寸不固定、文件过大或路径不对,它自己加载慢,就会在“空白 → 占位图 → 真实图”之间多一次跳变,比不用还糟。
- 占位图必须是
/static/下的本地资源,如/static/placeholder.png;网络地址在微信小程序里大概率被忽略 - 所有占位图统一导出为 100×100 或 200×200 像素,再用 CSS 缩放;避免用大图靠 width/height 压缩,解码耗时高
- 务必给
<image></image>设置明确的width和height(rpx 或 px),否则容器高度塌陷,placeholder 加载完也会触发重排










