MasonryGrid 瀑布流
通用数据驱动瀑布流布局组件,支持响应式列数、图片懒加载、无限滚动与空态占位。
何时使用
- 展示图片墙、卡片流、资讯流等大量非等高内容时。
- 需要按数据顺序横向逐行填充,并支持响应式列数与间距时。
- 需要图片懒加载、触底无限滚动、空数据占位等能力时。
特性
- 布局:flex 多列,第
i项放入第i % columns列(横向逐行填充,顺序与数据一致) - 懒加载:默认插槽内用
<img :data-src>的图片进入视口才真正加载,lazy可关闭、lazyRootMargin可调提前量 - 无限滚动:底部哨兵进入视口且
hasMore && !loading时触发load-more - 空态:
items为空且非加载时显示"暂无数据",可用#empty/#loading/#end插槽定制
基础用法
每一项内容完全由调用方通过默认插槽渲染,作用域为 { item, index }。
itemRender 渲染
当不便使用插槽时,可用 itemRender 函数返回 VNode(优先级低于默认插槽)。
图片懒加载
在默认插槽内使用 data-src(组件在图片进入视口时才赋值 src),非常适合大量图片瀑布流。
无限滚动与空态
hasMore 为 true 时触底自动触发 load-more;为 false 时显示"没有更多了"。items 为空且不在加载时显示"暂无数据"(可用 #empty 覆盖)。
响应式列数与间距
columns / gutter 支持断点映射(xs/sm/md/lg/xl/xxl,断点取值同 Ant Design 栅格)。
语义化 class / style
可用 classNames、styles 定制 root / column / item 结构。
导入
Props
| 参数 | 说明 | 类型 | 默认值 |
|---|---|---|---|
items | 瀑布流数据项 | object[] | [] |
columns | 列数(数字或断点映射) | number | { xs?; sm?; md?; lg?; xl?; xxl? } | 3 |
gutter | 间距(水平/垂直) | number | { 断点: number } | [GapType, GapType] | 0 |
lazy | 是否开启图片懒加载 | boolean | true |
lazyRootMargin | 懒加载提前量 | string | "200px" |
loading | 是否加载中 | boolean | false |
hasMore | 是否还有更多 | boolean | true |
emptyText | 空数据文案 | string | "暂无数据" |
loadingText | 加载中文案 | string | "加载中…" |
endText | 到底提示文案 | string | "没有更多了" |
itemRender | 自定义项渲染(返回 VNode,优先级低于默认插槽) | (item, index) => VNode | — |
classNames | 语义化结构 class(root / column / item) | Partial<Record<"root" | "column" | "item", string>> | — |
styles | 语义化结构 style(root / item) | Partial<Record<"root" | "item", CSSProperties>> | — |
class | 根元素附加类名 | string | — |
gutter为数字时水平/垂直同距;传[水平, 垂直]分开控制;断点映射取「当前档及以下已显式设置的最大档」。
断点
| 断点 | 最小容器宽度 |
|---|---|
xs | 0 |
sm | 576 |
md | 768 |
lg | 992 |
xl | 1200 |
xxl | 1600 |
Slots
| 插槽 | 说明 |
|---|---|
#default | 每个瀑布流项,作用域 { item, index } |
#empty | 空数据占位(覆盖默认"暂无数据") |
#loading | 加载中占位(首屏与滚动加载共用) |
#end | 无更多提示占位(覆盖默认"没有更多了") |
Events
| 事件 | 说明 | 回调参数 |
|---|---|---|
load-more | 触底需要加载更多 | () |
layoutChange | 列数变化 | (column: number) |
设计规范
- 数据项可用
key(string \| number)提供稳定唯一键以获得正确的复用 - 懒加载基于 DOM 约定:图片需带
data-src(不给src),组件在图片进入视口时才赋值src - 无限滚动触发后请将
loading置true以显示加载态并避免重复触发;完成后置false复位,hasMore置false停止
