uni.previewImage需严格满足三条规则:urls必须是非空字符串数组且每项含协议或完整路径,current必须与urls中某项完全相等,数组不得含null/undefined/空字符串;九宫格点击应直接传原始src而非index或拼接路径;H5仅支持网络图,App/小程序需HTTPS或合法临时路径,大图须压缩;image需用padding-bottom+object-fit/mode控制比例防变形;路径必须全程标准化。

直接用 uni.previewImage 就能实现,但传参错一个字符、路径少个斜杠、数组里混进 null,整个预览就黑屏或报错——不是功能不行,是参数校验太严。
uni.previewImage 传参必须满足这三条硬规则
它不接受索引、不兼容相对路径、不自动过滤无效项,只认“完全匹配的字符串”。常见崩溃点都在这里:
-
urls必须是长度 ≥1 的字符串数组,每项带协议(https://)或完整本地路径(/static/xxx.jpg或小程序临时路径wxfile://) -
current必须是urls中某一项的**完全相等字符串**(大小写、斜杠方向、末尾空格都算不同) - 数组里不能有
null、undefined、空字符串,filter要写成:const validUrls = urls.filter(u => typeof u === 'string' && u.trim())
九宫格点击时怎么传 current 才不出错
别传 index,也别传 item.src 后再拼接——直接把当前图片原始 URL 原样传过去。关键在模板层绑定:
<image v-for="(src, i) in picList" :key="i" :src="src" @click="() => uni.previewImage({ urls: validUrls, current: src })" />
注意两点:
-
validUrls是过滤后的数组,src必须是它里面存在的那一项(不能是后端返回的原始字段,得和数组里一致) - H5 端只支持网络图;App 和小程序支持临时路径,但
tempFilePaths页面跳转后失效,预览必须在同页面内触发
图片加载失败或黑屏的三个真实原因
不是代码写错了,而是路径、生命周期或平台限制没对齐:
- 本地图写了
1.jpg没加/static/前缀 → App 和小程序识别为非法路径 - 网络图用了
http://→ 小程序要求 HTTPS,H5 可能被浏览器拦截 - 大图未压缩直接传 → iOS App 解码崩溃,表现为黑屏或闪退;建议服务端返回 ≤1200px 宽、q=60 的 JPEG
flex 九宫格容器里 image 怎么写才不拉伸变形
直接给 <image> 设宽高没用,尤其在 App 端——它不响应 height。必须包一层 <view> 并控制比例:
- 外层
view设width: 100%; padding-bottom: 100%(正方形)或padding-bottom: 75%(4:3) - 内层
image设width: 100%; height: 100%; position: absolute; top: 0; left: 0; object-fit: cover(H5)或mode="aspectFill"(小程序/App) - 别用
scaleToFill:人像五官会拉长,文字图会糊
最易被忽略的是:预览前没做路径标准化——同一张图在列表里是 /static/a.jpg,在 urls 数组里却是 static/a.jpg(少个斜杠),current 就永远匹配不上。路径必须从头到尾保持字符串完全一致。


















