跳转到内容

无限滚动 infinite-scroll

数据展示组件。三层同源:无头内核给出解剖与状态机,Vue 组件与自定义元素只是它的两层外壳,行为完全一致。

示例

基础用法

哨兵滚进可视区就派 load,取完把 loading 写回 false

第 1 条
第 2 条
第 3 条
第 4 条
第 5 条
第 6 条
第 7 条
第 8 条
第 9 条
第 10 条
第 11 条
第 12 条

提前量

distance 把可视区沿块轴向外扩,哨兵还没露头就先取下一页

第 1 条
第 2 条
第 3 条
第 4 条
第 5 条
第 6 条
第 7 条
第 8 条
第 9 条
第 10 条
第 11 条
第 12 条

取到没有了

最后一页取完把 disabled 打开,哨兵不再被观察,load 也不再派

第 1 条
第 2 条
第 3 条
第 4 条
第 5 条
第 6 条
第 7 条
第 8 条
第 9 条
第 10 条
第 1 / 3 页 · 共 10 条

默认插槽透出状态

phase / loading / disabled 从插槽拿,加载提示与结束语都由宿主自己摆

第 1 条
第 2 条
第 3 条
第 4 条
第 5 条
第 6 条
第 7 条
第 8 条
第 9 条
第 10 条

继续往下滚(当前 idle)

产物

自定义元素<xh-infinite-scroll>
Vue 组件XhInfiniteScrollRoot XhInfiniteScrollSentinel
组合式函数useInfiniteScroll
状态机无,connect 直接由 props 算属性
皮肤@xihan-ui/styles/infinite-scroll.css

解剖

部件名即 data-part 属性值,也是皮肤的选择器。加粗的是必备部件,不渲染它组件不工作(Web Components 适配器会在诊断通道上报 wc.missing-part)。

data-scope="infinite-scroll"root · sentinel

Props

属性类型必填说明
distancenumber提前量(px):哨兵离可视区还有这么远就算进入,默认 0(真正露头才算)。扩的是 getTargetEl 给出的那块可视区。
disabledboolean关掉:不再观察,也不再触发。列表已经没有下一页时用它。
loadingboolean正在取数:其间不观察、不重复触发。取完由宿主写回 false。
onLoad() => void该取下一页了。

状态机

事件SENTINEL.ENTER · MODE.SYNC

判据isPaused · isLoading

connect API

useInfiniteScroll 产出的对象。getXxxProps() 铺到对应部件的宿主元素上,其余是可读状态与操作入口。

成员类型说明
phaseInfiniteScrollPhase
loadingboolean正在取数。
disabledboolean已关掉,不再观察。
getRootProps() => T['element']
getSentinelProps() => T['element']

键盘

规格出处:W3C APG

无键盘交互(不接收焦点,或焦点行为完全由原生元素提供)。

Released under The MIT License