ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

rsuite SelectPicker 虚拟列表(Virtualized)指南:万级选项轻松渲染

rsuite SelectPicker 虚拟列表(Virtualized)指南:万级选项轻松渲染 前端UI组件【免费下载链接】rsuite A suite of React components .项目地址https://gitcode.com/gh_mirrors/rs/rsuite点击查看免费下载本指南讲解 rsuite 中SelectPicker组件的virtualized虚拟列表能力展示如何让选择器在数据量达到上万条时依然流畅渲染。文章从示例代码出发深入源码剖析虚拟化在列表渲染、分组支持与滚动定位上的实现原理并给出listProps等配套参数的实际用法帮助你在大数据选择场景下写出高性能、可落地的代码。场景为什么需要虚拟化SelectPicker用于单选场景并支持分组。但当一个下拉选项列表动辄数千甚至上万条时传统做法会把所有li一次性渲染进 DOM。数据量一大首屏渲染与交互都会明显变慢。rsuite 的解决方案是在 SelectPicker.tsx 上暴露virtualized?: boolean属性配合内部Listbox组件启用“窗口化windowing”渲染只绘制视口附近的少量行从根源上控制 DOM 节点数量。官方示例给出了一个非常典型的大数据场景构造 1 万条选项每条 label 是包含长文本的字符串模拟真实业务里的冗长选项。快速开始在 SelectPicker 上开启虚拟化把virtualized加在组件上即可其余 API 完全不变import { SelectPicker } from rsuite; const data Array.from({ length: 10000 }).map((_, index) { return { label: Item ${index} is a long text, Used to test the virtualized list., value: Item ${index} }; }); const App () ( SelectPicker data{data} w{224} virtualized / / ); ReactDOM.render(App /, document.getElementById(root));要点说明数据形态data仍是标准的Option数组每个元素包含label展示文本与value选中值两个字段字段名可通过labelKey/valueKey自定义默认分别为label与value见 SelectPicker.tsx 的默认值声明。触发开关只需传入virtualized布尔值Listbox内部即切换到虚拟渲染分支。组合使用虚拟化可与搜索、分组、禁用项、受控等既有能力并存无需额外适配。源码原理虚拟化是如何被触发的virtualized的完整链路横跨三个模块可以按数据流理解组件层SelectPicker.tsx 将virtualized与listProps透传给内部ListboxlistProps的类型是PartialListProps。列表容器层Listbox.tsx 接收这两个属性。渲染时它会判断virtualized分支开启时外层套上AutoSizer自动测量容器高度内部使用List默认以VariableSizeList实现按rowCount渲染可视窗口内的行未开启时走filteredItems.map(...)全量渲染路径。窗口化实现层List.tsx 基于react-window的VariableSizeList封装。它对外暴露scrollTo、scrollToItem、resetAfterIndex等方法并透传itemSize、initialScrollOffset、onScroll、onItemsRendered等标准能力。值得注意的细节是Listbox中的getRowHeightListbox.tsx它把普通行高度设为rowHeight默认 36px把分组标题行设为rowGroupHeight默认 48px并据此为VariableSizeList提供itemSize回调。这意味着开启分组groupBy时虚拟列表依然能正确处理高低不等的行。结合搜索与分组使用虚拟化并不会破坏 SelectPicker 已有的行为搜索输入关键词后useSearch先基于labelKey/searchBy过滤数据得到filteredDataListbox只对过滤后的结果做窗口化因此搜索结果仍然是精准的局部渲染。开启虚拟化时匹配到的 label 文本会通过 Highlight 组件高亮见renderItem中的query处理。分组groupBy指定的分组结构在虚拟化下同样有效getRowHeight会为分组标题行单独计算高度折叠分组foldedGroupKeys状态下行数还会随之收缩。键盘导航Listbox在focusItemValue变化时会通过scrollTop计算把焦点项滚动到可视区域同时useMount时会调用listRef.current?.scrollToItem(activeItemValues[0])让打开面板时自动定位到当前选中项。虚拟列表的滚动逻辑与这些机制完全兼容。深度定制listProps 与 ListProps 全参数virtualized开启后可以通过listProps向底层虚拟列表透传能力。其类型定义在 docs/pages/_common/types/list-props.md对应运行时实现见 List.tsx 与 react-window 的 List 接口参数类型说明itemSizenumber \| ((index) number)行尺寸传函数时用于动态高度行SelectPicker 内部已按分组自动计算initialScrollOffsetnumber初始渲染时的滚动偏移量可用于“定位到第 N 行”的打开即定位效果onItemsRendered(props: ListOnItemsRenderedProps) void可视行集合变化时回调常用于配合无限滚动加载更多数据onScroll(props: ListOnScrollProps) void列表滚动时回调可拿到滚动偏移量典型用法示例SelectPicker data{data} virtualized listProps{{ initialScrollOffset: 1000, // 打开时定位到滚动偏移 1000px 附近 onScroll: ({ scrollOffset }) { console.log(scroll offset, scrollOffset); } }} /补充说明从 List.tsx 的实现看ListProps还包含itemKey、scrollShadow、width等字段并支持rowHeight已标记为 deprecated建议改用itemSize。List默认以VariableSizeList渲染并通过direction属性兼容 RTL 场景。相关能力延伸虚拟列表是 SelectPicker 大数据处理的一部分配套的还有无限加载官方另提供 infinite-loader.md 示例利用onScroll到达底部时追加数据可与virtualized组合用于“分页拉取 流畅滚动”的方案。异步加载见 async.md配合loading状态在数据到达前展示加载动画。长列表可读性配合groupBy分组、searchable搜索让万级数据既能快速定位又能保持清晰层级。以上示例片段位于 docs/pages/components/select-picker/fragments/virtualized.md可作为完整可运行的参考。小结SelectPicker的virtualized属性为万级选项场景提供了开箱即用的高性能方案一行配置即可把全量 DOM 渲染切换为窗口化渲染底层由ListboxAutoSizerVariableSizeList协作完成并天然兼容分组、搜索、键盘导航与 RTL。配合listProps的initialScrollOffset、onScroll、onItemsRendered你还可以实现打开即定位、无限加载等高级交互让大数据选择体验既快又完整。赞分享前端UI组件【免费下载链接】rsuite A suite of React components .项目地址https://gitcode.com/gh_mirrors/rs/rsuite点击查看免费下载相关推荐rsuite Table 虚拟滚动virtualized实战轻松渲染万级数据行rsuite Table 虚拟滚动virtualized实战轻松渲染万级数据行 导读 本文以 rsuite 官方文档中的 Table 虚拟滚动示例为核心前端UI组件rsuite CheckPicker 虚拟列表virtualized实战万级选项下的多选下拉性能优化指南rsuite CheckPicker 虚拟列表virtualized实战万级选项下的多选下拉性能优化指南 CheckPicker 是 rsuite 提供的前端UI组件抖音批量下载完整指南10 分钟完成首次无水印归档抖音批量下载完整指南10 分钟完成首次无水印归档 douyin downloader 是一款开源的抖音批量下载工具传入链接和一份 YAML 配置视频、图文前端UI组件上一篇如何在Ryujinx模拟器中实现完美网络连接从零开始配置联机功能下一篇G-Helper深度解析华硕笔记本性能调校的效率革命创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表