Album 相册
九宫格图片组:单图大图、多图网格、超出数量折叠为剩余数量格;点击图片打开内置全屏画廊(横滑翻页 + 页码胶囊 + 描述条)。适合动态配图、评价晒单、商品详情图组等嵌入内容流的图片组展示。
平台兼容性
| App(Android/iOS) | Web | 微信小程序 | 鸿蒙 |
|---|---|---|---|
| ✓ | ✓ | ✓ | ✓ |
基本使用
urls 传图片地址数组;一张图走单图形态(single-size 边长),多张走网格(默认每行 3 张等分):
html
<n-album :urls="['https://cdn.example.com/a.jpg', 'https://cdn.example.com/b.jpg', 'https://cdn.example.com/c.jpg']" />
点击任意图片会打开全屏画廊(横滑翻页、页码胶囊);不需要点击预览时设 preview-full-image 为 false:
html
<n-album :urls="urls" :preview-full-image="false" />
对象数组
urls 为对象数组时,图片地址取 key-name 指定的字段(默认 src);画廊描述条文本取 descr-key 指定的字段(默认 descr,缺失该字段的图片不显示描述条):
html
<n-album :urls="list" key-name="pic" descr-key="caption" />
ts
const list = [
{ pic: '/static/a.jpg', caption: '第一张的说明文字' },
{ pic: '/static/b.jpg' }
];
数量与布局
max-count 限制最多展示的图片数,超出部分折叠到最后一位(半透明深色格 + 剩余数量),show-more 关闭后直接截断;点击数量格从最后一张可见图继续预览:
html
<n-album :urls="urls" :max-count="4" :show-more="false" />
row-count 大于 0 时按行数等分布局(multiple-size 不参与);设为 0 关闭等分,改按 multiple-size 定尺寸自由换行。space 控制格间距:
html
<n-album :urls="urls" :row-count="2" />
<n-album :urls="urls" :row-count="0" multiple-size="120rpx" space="10" />
全屏画廊
画廊翻页时发送 change(载荷 {index}),点击图片关闭时发送 close;也可以用实例方法程序化开关(先声明有类型的 ref):
html
<n-album ref="album" :urls="urls" @change="onChange" @close="onClose" />
ts
// 打开画廊并定位到第 3 张(下标从 0 起,越界自动钳制);urls 为空时忽略
album.value?.openPreview(2);
// 程序化关闭(不发 close 事件)
album.value?.closePreview();
图文对齐
相册宽度由容器决定;需要让相邻文字与图片组对齐时,监听 album-width 取实测宽度(布局就绪与容器尺寸变化时触发):
html
<n-album :urls="urls" @album-width="onAlbumWidth" />
<text :style="'width:' + albumWidth + 'px'">与相册等宽的说明文字</text>
API
Props
| 属性 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| urls | 图片列表:字符串数组(直接作地址),或对象数组(地址取 item[keyName]、描述取 item[descrKey]) | string[] | UTSJSONObject[] | [] |
| key-name | urls 为对象数组时,图片地址的属性名 | string | src |
| descr-key | urls 为对象数组时,画廊描述条文本的属性名;缺失该字段的图片不显示描述条 | string | descr |
| single-size | 单图时的边长(正方形,宽高同值,超出相册宽度时收缩到容器宽);数字 px 或 px/rpx 字符串 | string | number | 180 |
| multiple-size | 多图时每格边长(正方形);row-count 大于 0 的等分布局下不参与布局 | string | number | 70 |
| space | 多图格与格的间隔(横向与纵向同值);数字 px 或 px/rpx 字符串 | string | number | 6 |
| single-mode | 单图的裁剪缩放模式(image 原生 mode) | string | scaleToFill |
| multiple-mode | 多图的裁剪缩放模式(image 原生 mode) | string | aspectFill |
| max-count | 最多展示的图片数量,超出部分折叠到最后一位(show-more 控制是否显示剩余数量);0 = 不限制 | number | 9 |
| row-count | 每行图片数量:大于 0 时等分布局(multiple-size 不参与);0 = 关闭等分,按 multiple-size 定尺寸自由换行 | number | 3 |
| show-more | 超出 max-count 时最后一位显示剩余数量(半透明深色格 + 白字);点击它从最后一张可见图继续预览 | boolean | true |
| preview-full-image | 点击九宫格图片是否打开全屏画廊;false 时点击无响应 | boolean | true |
| z-index | 全屏画廊层级(弹层族语义内:遮罩 1000 之上),与弹层同用时按需调大 | number | 1001 |
| safe-area | 画廊描述条是否垫底部安全区(手势条机型留出小白条高度) | boolean | true |
| ellipsis | 画廊描述文本超出宽度时省略为单行;false 多行完整显示 | boolean | false |
| custom-class | 挂到根节点的额外 class(类须定义在组件样式表内) | string | — |
| custom-style | 根节点行内样式,如 margin:12px;拼接在内部样式之后 |
string | — |
Events
| 事件名 | 说明 | 回调参数 |
|---|---|---|
| album-width | 相册容器实测宽度就绪或变化时触发(图文对齐用) | { width: number } |
| change | 画廊翻页时触发(原生滑切;程序定位不发) | { index: number } |
| close | 点击画廊图片关闭时触发(程序化 closePreview 不发) | — |
Methods
| 方法名 | 说明 | 参数 |
|---|---|---|
| openPreview | 打开全屏画廊并定位到指定下标(越界钳制、负值归 0);urls 为空时忽略 | (index?: number) |
| closePreview | 程序化关闭全屏画廊(不发 close 事件) | — |
Slots
无插槽。
实现说明(与参考实现的机制对照)
| 参考做法 | 本库做法 | 分歧理由 |
|---|---|---|
| 全屏预览调 uni.previewImage(原生接口,外观不可定制) | 内置自绘全屏画廊(swiper 翻页 + 页码胶囊 + 描述条) | preview-full-image 的 API 语义不变(点击可预览的开关),参考接口未暴露任何预览层配置,换实现不损失 API 面;系统预览已由图片组件承担,本组件的差异化价值在可定制画廊(页码、描述条) |
| 画廊独立受控用法(show / current 属性驱动显隐与定位) | 方法通道 openPreview(index) / closePreview() | 瞬时交互层的方法式打开(裁剪器同款);翻页回执 change 与点击关闭 close 保留 |
| 画廊关闭事件名为 hide(通知使用方把 show 置 false) | 改名 close | 受控通道换成方法后,hide 的"通知收起"职责由组件内部消化,事件语义收敛为"画廊被点击关闭" |
| key-name 默认值未给(文档标 -) | 默认 "src" | 参考画廊组件 srcKey 的明文默认值,两参考源取同惯例 |
| row-count 默认 3,文档写明设置后 multiple-size 无效 | row-count = 0 作为关闭等分的通道 | 默认 3 使 multiple-size 恒无生效场景(历史包袱);0 = 按 multiple-size 定尺寸自由换行,让两个尺寸属性各有所用 |
| max-count 折叠格只说"显示剩余图片数量" | 半透明深色格 + 白字,点击从最后一张可见图继续预览 | 参考未定义视觉与点击行为;深色融入图片网格语境(不随主题),点击行为与浏览习惯一致 |
| 画廊显隐无过渡(display 直接切换) | 固定短淡入淡出(无属性暴露) | 弹层族全部带过渡,硬切观感突兀;固定时长不增加属性面 |
注意事项
- 微信端画廊内图片建议使用网络路径;本地代码包路径在小程序图片组件中受包体积限制
urls为空时组件渲染空容器(不占位内容),首个可用图片就位前不会拉起画廊- 图片加载失败的占位与重试不在本组件职责内(需要时在 urls 层先行校验或换用图片组件单独展示)