uni.previewimage 的 urls 必须为数组,current 推荐传数字索引;需过滤无效图片、校验 url、避免本地临时路径直传;loop 和 indicator 各端表现不一,建议禁用或自定义实现。

uni.previewImage 传参必须用数组,current 不能只传单图 URL
很多人以为点哪张图就只传那张图的 URL 进去,结果预览器只显示一张、无法滑动——这是因为 uni.previewImage 的 urls 是强制要求的参数,哪怕你只想预览一张,也得包成数组;current 只是定位索引或匹配项,不是“仅展示这张”的开关。
-
current推荐传数字索引(如0),比传 URL 更稳定,尤其在 urls 里有重复链接或含查询参数时容易匹配失败 - 如果传字符串 URL 做
current,它会遍历urls数组做===匹配,大小写、末尾斜杠、query 参数差异都会导致定位失败 - H5 端对本地路径(如
/static/xxx.jpg)支持较好,但微信小程序不支持直接预览本地临时路径(tempFilePath),必须先上传获得线上 URL 或使用云存储临时链接
多图预览前要过滤无效图片,否则白屏或中断
用户上传后可能混入空值、视频地址、404 图片或跨域资源,一旦进 urls 数组,uni.previewImage 在某些平台(尤其是 iOS App)会直接失败或卡死,且无明确错误提示。
- 务必在调用前 clean 数据:
urls = this.imageList.filter(url => url && typeof url === 'string' && !url.startsWith('data:') && !url.includes('video')) - 避免把
videoUrl或null、undefined误塞进数组,常见于从接口拉取的混合媒体列表 - 微信小程序中,如果某张图加载超时或 404,整个预览器可能停留在 loading 状态,建议提前用
uni.getImageInfo做轻量校验(非必须,但关键场景值得加)
loop 和 indicator 在不同端表现不一致,别默认开启
loop: true 看起来很友好,但实际在 H5 端不生效,在部分安卓 App 上滑到末尾再划会卡顿;indicator: 'number' 在微信小程序显示为“1/3”,但在 H5 端压根不显示——这些不是 bug,是各端原生组件能力差异导致的。
- 如果你需要全端统一指示器,别依赖
indicator,改用自定义悬浮层 +current监听回调(success不触发,得靠uni.onPreviewImageChange,但仅 App 支持) -
loop建议保持false,除非你明确只跑 App 端且已测试过边界滑动体验 - 微信小程序支持
longPressActions,但 H5 和 App 不支持,想加保存/分享按钮就得自己实现覆盖层,不能指望 API 原生带
点击事件绑定位置不对,会导致 current 索引错乱
常见写法是在 v-for 里给 image 绑 @click="previewImage(index)",看起来没问题,但如果列表是动态渲染(比如分页加载、搜索过滤),index 就是当前页的局部索引,不是全局数组下标。
- 更稳妥的方式是传原始数据项:
@click="previewImage(item)",然后在方法里用urls.indexOf(item)查索引(前提是 item 是原始 URL 字符串) - 或者维护一个扁平化图片数组
allImages,所有预览都基于它,点击时传allImages.indexOf(src) - 千万别在循环中用
:key="index"同时又用index当预览索引——Vue 列表重排后 key 不变,但 index 已变,极易出错










