Loadable
基于 IntersectionObserver 的无限滚动容器。组件自身不渲染 wrapper,只把 slot 内容和一个哨兵元素依次挂到父容器里——当哨兵进入浏览器视口(距离底部 120px 提前)时触发 load。
布局和滚动都由父容器提供
Loadable 只是"在末尾插一个哨兵",flex-col / grid / overflow-auto 的高度限定都要写在外层 wrapper 上。class prop 只控制加载中 spinner 的样式。
基本用法
有界盒内滚动加载
外层 wrapper 设定固定高度 + overflow-y-auto,用户在盒子内滚动,哨兵进入视口时追加 5 项,最多 30 项。
列表项 0
列表项 1
列表项 2
列表项 3
列表项 4
已加载 5 / 30 项
API
Props
| 名称 | 类型 | 默认值 | 说明 |
|---|---|---|---|
load必填 | () => any | — | 触发加载的异步函数,返回 Promise。调用期间不会并发重复触发 |
class | string | — | 加载中 spinner 外层容器的 class(注意:不是列表 wrapper) |
Slots
| 插槽 | 作用域 | 说明 |
|---|---|---|
default | — | 列表内容,直接作为父容器的子节点渲染 |
渲染结构
(你的 wrapper)提供 flex-col / grid / overflow-auto / 高度等布局slot 内容你渲染的每一个列表项哨兵 div组件在末尾追加的空 div;加载中渲染 LoadingIcon
行为细节
- IntersectionObserver 配置为
root: null、rootMargin: '0px 0px 120px 0px':以浏览器视口为基准,距离底部 120px 提前触发,减少加载空白 - 只要 wrapper 本身位于视口内,内部 overflow 滚动也能触发 ——
getBoundingClientRect()会反映滚动偏移 - 加载期间标记
loading = true,阻止并发;出错写到console.error后重置状态 - 组件不自带列表语义,纯列表场景请在 wrapper 上设
role="list"、子项设role="listitem"