商品详情页做了个九宫格,点第一张能放大,点第三张直接没反应。控制台一行 previewImage:fail invalid url。代码里 urls 传的是图片列表,看着没问题。

urls 必须是字符串数组

接口返回的常是 [{id, url}] 这种结构,直接 uni.previewImage({urls: list}) 就错了。要 map 一下取出 url,或者在模板里绑 item.url。current 可以传索引,也可以传某个 url 字符串,传对象同样报错。

uni.previewImage({urls: list.map(i => i.url), current: index});

相对路径要补全域名

后端返回 /uploads/a.jpg,小程序里没有当前域名概念,必须拼上 https 的完整地址。H5 端相对路径能显示,App 和小程序不行,所以同一份数据在三个端表现不一样。图片服务器要支持 https,http 地址在真机上会被拦。

本地临时文件要先转

chooseImage 拿到的是 tempFilePath,可以直接传给 previewImage,但上传后应该用服务器返回的地址。base64 字符串在部分端不支持,别指望它能预览。文件路径带中文或空格,先 encodeURIComponent。

点击事件里的索引

v-for 里写 @click='preview(index)',别在循环里直接用 item,容易拿到最后一个。列表更新后索引可能错位,用图片 id 找当前位置更稳。预览黑屏还有一种情况:图片本身 404,先在新标签页打开地址确认。

先把 urls 打印出来看一眼,是数组还是对象,一眼就能定位。