浅谈虚拟列表实现与原理分析,虚拟卷帘
npm i react-x-virtual
import React from 'react'; import VirtualList from 'react-x-virtual'; const { Header: VirtualHeader, Footer: VirtualFooter, Section: VirtualSection, } = VirtualList; // JSX <VirtualList {...mixinProps} ref={vlistRef} scrollX width={600} height={200}> <VirtualSection itemCount={2050}> <VirtualHeader width={100}> <div className="ContentTextBox"> <p>First Header</p> </div> </VirtualHeader> <Row>First Section Row</Row> <VirtualFooter width={120}> <ContentTextBox tag="section-1" /> </VirtualFooter> </VirtualSection> <VirtualSection itemCount={1500}> <VirtualHeader width={150}> <ContentTextBox tag="section-2" /> </VirtualHeader> <Row>Second Section Row</Row> <VirtualFooter width={100}> <ContentTextBox tag="section-2" /> </VirtualFooter> </VirtualSection> </VirtualList>; API
type TypeItemSizeHandler = Array<number> | Array<(idx: number):number> type TypeSize = number | string type TypeAlignment = 'auto' | 'start' | 'center' | 'end' type TypeAlignTo = 'none' | 'top' | 'bottom' <List /> API
| 属性 | 类型 | 默认值 | 是否必填 | 说明 |
|---|---|---|---|---|
| itemCount | number | 0 | √ | 长列表有多少个 Cell |
| scrollX | boolean | false | 设置为横向滚动 | |
| scrollY | boolean | true | 设置为竖向滚动 | |
| initialScrollIndex | number | 0 | 在列表初始化时即可指定显示的 index,避免初始化后再通过 scrollTo 系列方法产生的闪动 | |
| onScroll | EventHandler | 滚动时触发 | ||
| scrollEventThrottle | number | 10 | 指定滑动事件的回调频率,传入数值指定了多少毫秒(ms)组件会调用一次 scroll 回调事件 | |
| onStartScroll | EventHandler | 开始滚动时触发 | ||
| onEndScroll | EventHandler | 结束滚动时触发 | ||
| upperThreshold | number | 50 | 距顶部/左边多远时(单位 px),触发 scrolltoupper 事件 | |
| onScrollToUpper | EventHandler | 滚动到顶部/左边 | ||
| lowerThreshold | number | 50 | 距底部/右边多远时(单位 px),触发 scrolltolower 事件 | |
| onScrollToLower | EventHandler | 滚动到底部/右边 | ||
| initialRows | number | 5 | 在异步长列表实现中, 首次渲染多少行数据. 需要能覆盖显示区域 | |
| scrollTo | number | √ | 滑动的距离 | |
| width | TypeSize | √ | 容器宽度,当 scrollX 时必填 | |
| height | TypeSize | √ | 容器高度,当 scrollY 时必填 | |
| itemSize | TypeItemSizeHandler | [50, ...] | √ | 列表子项高度配置 |
| estimatedItemSize | number | 50 | 预估列表子项尺寸 | |
| scrollToAlignment | TypeAlignment | 'auto' | 滚动对齐策略 |
| 属性 | 类型 | 默认值 | 是否必填 | 说明 |
|---|---|---|---|---|
| width | TypeSize | √ | Header 宽度,当 scrollX 时必填 | |
| height | TypeSize | √ | Header 高度,当 scrollY 时必填 |
| 属性 | 类型 | 默认值 | 是否必填 | 说明 |
|---|---|---|---|---|
| width | TypeSize | √ | Footer 宽度,当 scrollX 时必填 | |
| height | TypeSize | √ | Footer 高度,当 scrollY 时必填 |
| 属性 | 类型 | 默认值 | 是否必填 | 说明 |
|---|---|---|---|---|
| itemCount | number | 0 | √ | Section 有多少个 Cell |
| 属性 | 类型 | 默认值 | 是否必填 | 说明 |
|---|---|---|---|---|
| onNodeAppear | EventHandler | 节点可见时的回调 |
虚拟列表抛掷动画,调用方式如下:
virtualListRef.current.scrollToPosition(/* params */);
Params 参数示意:
| 属性 | 类型 | 默认值 | 是否必填 | 说明 | |
|---|---|---|---|---|---|
| position | number | √ | 取值范围:0 ~ itemCount。虚拟子节点 index (在包含多个 section 的情况下,不是 section 内的 itemIndex) | ||
| smooth | boolean | false | √ | 是否有平滑动画 | |
| alignTo | TypeAlignTo | 'none' | √ | 滚动后目标节点的对齐方式(默认对齐/顶部对齐/底部对齐) |
如对实现感兴趣,可以参考我的博客:浅谈虚拟列表实现与原理分析
版权声明:
1、该文章(资料)来源于互联网公开信息,我方只是对该内容做点评,所分享的下载地址为原作者公开地址。2、网站不提供资料下载,如需下载请到原作者页面进行下载。