更新记录
1.0.0(2026-08-12)
uni-app大数据虚拟滚动选择器,支持搜索、多选、树形、懒加载和动态高度。
平台兼容性
uni-app(3.8.1)
| Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|
| √ | √ | √ | √ | √ | √ | √ | √ | √ |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| √ | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ |
uni-app x(3.8.1)
| Chrome | Safari | Android | iOS | 鸿蒙 | 微信小程序 |
|---|---|---|---|---|---|
| - | - | - | - | - | - |
Virtual Select Pro
面向大数据量场景的高性能虚拟滚动选择器,适用于长分类、组织架构、城市列表、商品类目和远程搜索场景。
发布信息
| 项目 | 内容 |
|---|---|
| 插件 ID | virtual-select-pro |
| 插件名称 | Virtual Select Pro 高性能虚拟选择器 |
| 简短描述 | uni-app大数据虚拟滚动选择器,支持搜索、多选、树形、懒加载和动态高度。 |
| 标签 | 虚拟列表、选择器、大数据、树形、多选 |
| 版本 | 1.0.0 |
| 依赖 | 无第三方依赖 |
插件 ID 长度为 18 个字符,未使用 uni 等保留前缀,适合直接提交插件市场。
特性
- 虚拟窗口渲染:只保留可视行和缓冲行,数据量增加不会等比例增加视图节点。
- 固定高度与动态高度:动态模式使用
uni.createSelectorQuery()测量已渲染行,并通过前缀和与二分定位。 - 搜索能力:支持本地关键字、拼音全拼、首字母搜索,也可通过
remoteSearch接入异步远程搜索。 - 选择模式:支持单选、多选、复选框、树形展开和懒加载。
- 跨端实现:Vue 3 Composition API + TypeScript,无第三方依赖,无直接 DOM 操作。
- 主题定制:支持 CSS Variables 覆盖主题色、行高、字号、边框和选中态。
安装与使用
通过插件市场导入后,组件位于:
uni_modules/virtual-select-pro/components/v-virtual-select/v-virtual-select.vue
手动导入示例:
<script setup lang="ts">
import { ref } from 'vue'
import VVirtualSelect from '@/uni_modules/virtual-select-pro/components/v-virtual-select/v-virtual-select.vue'
const selected = ref<number | null>(null)
const options = [
{ value: 1, label: '北京业务分类', pinyin: 'beijingyewufenlei', spell: 'bjywfl' }
]
</script>
<template>
<v-virtual-select v-model="selected" :options="options" searchable :height="420" />
</template>
如果你的项目已配置 easycom,也可以按项目规范自动引入。
数据结构
默认字段为 value、label、children。业务字段不同可通过 valueKey、labelKey、childrenKey 指定。
type SelectOption = {
value: string | number
label: string
pinyin?: string
spell?: string
disabled?: boolean
hasChildren?: boolean
children?: SelectOption[]
}
组件不内置中文转拼音字典,以控制包体积。建议服务端或数据构建阶段预写 pinyin、spell 字段。
Props
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| modelValue | string \| number \| Array \| null |
null |
v-model 绑定值,多选时为数组 |
| options | Array<object> |
[] |
数据源 |
| valueKey | string |
value |
值字段 |
| labelKey | string |
label |
文本字段 |
| childrenKey | string |
children |
子节点字段 |
| pinyinKey | string |
pinyin |
拼音全文字段 |
| spellKey | string |
spell |
首字母字段 |
| searchKeys | string[] |
[] |
附加本地搜索字段 |
| hasChildrenKey | string |
hasChildren |
懒加载子节点标记字段 |
| height | number \| string |
420 |
滚动区域高度,数字单位为 px |
| itemHeight | number |
48 |
固定行高或动态模式预估行高 |
| dynamicHeight | boolean |
false |
是否启用动态行高测量 |
| buffer | number |
6 |
上下额外渲染行数 |
| multiple | boolean |
false |
多选模式 |
| checkbox | boolean |
false |
显示复选框,多选时自动显示 |
| tree | boolean |
false |
启用树形模式 |
| searchable | boolean |
false |
显示搜索输入框 |
| debounce | number |
220 |
搜索防抖时间,单位 ms |
| remoteSearch | (keyword) => Promise<Array> |
- | 异步搜索函数 |
| lazyLoad | (option, resolve, reject) => void |
- | 展开懒加载节点时调用 |
| disabled | boolean |
false |
全局禁用 |
| disabledKey | string |
disabled |
单项禁用字段 |
| indent | number |
18 |
树层级缩进,单位 px |
| showScrollbar | boolean |
true |
是否显示原生滚动条 |
| theme | Record<string, string> |
{} |
CSS Variables 覆盖 |
Events
| 事件 | 参数 | 说明 |
|---|---|---|
update:modelValue |
value |
v-model 更新 |
change |
value, option |
选择结果变化,多选时 option 为数组 |
select |
option, selected |
单项点击结果 |
search |
keyword |
防抖后的搜索关键字 |
lazy-load |
option |
懒加载开始 |
error |
error, type |
远程搜索或懒加载错误 |
Slots
| 插槽 | 参数 | 说明 |
|---|---|---|
item |
{ option, row, selected } |
自定义行内容,仅虚拟窗口内执行 |
empty |
- | 无匹配数据提示 |
实例方法
| 方法 | 说明 |
|---|---|
scrollToTop() |
滚动到顶部 |
search(keyword) |
主动设置搜索关键字 |
clearSearch() |
清空搜索 |
主题变量
<v-virtual-select
:theme="{
'--vvs-primary': '#7c3aed',
'--vvs-selected': '#f2ebff',
'--vvs-row-height': '48px',
'--vvs-font-size': '15px'
}"
/>
可用变量:--vvs-primary、--vvs-text、--vvs-muted、--vvs-border、--vvs-hover、--vvs-selected、--vvs-row-height、--vvs-font-size。
性能参考
测试配置:10,000 条扁平数据,行高 48px,容器高度 420px,buffer=8,默认行模板。结果会受设备、运行模式和业务插槽复杂度影响。
| 指标 | 普通全量列表 | Virtual Select Pro |
|---|---|---|
| 初始视图节点 | 10,000 | 约 25-35 |
| 首次渲染复杂度 | O(n) | O(visible + buffer) |
| 单次滚动参与布局节点 | 10,000 | 约 25-35 |
| 动态高度定位 | 常见线性累计 | 前缀和 + O(log n) 二分 |
| 10 万级建议 | 不建议全量渲染 | 固定行高优先,buffer 6-12 |
推荐:固定高度列表优先保持 dynamicHeight=false。仅在确实存在不等高内容时启用动态高度,并避免在 item 插槽内放置深层递归组件或复杂同步计算。
跨端兼容
| 平台 | 虚拟滚动 | 动态高度 | 树形懒加载 | 远程搜索 |
|---|---|---|---|---|
| H5 | 支持 | 支持 | 支持 | 支持 |
| 微信小程序 | 支持 | 支持 | 支持 | 支持 |
| 支付宝小程序 | 支持 | 支持 | 支持 | 支持 |
| App Android | 支持 | 支持 | 支持 | 支持 |
| App iOS | 支持 | 支持 | 支持 | 支持 |
动态高度测量使用 uni.createSelectorQuery(),未使用 window、document 或直接 DOM API。Vue 2 项目不支持本组件,请使用 Vue 3 项目模板。
使用约束
- 树形数据的
value建议全局唯一。 - 异步
remoteSearch应返回数组,组件会用请求序号避免慢请求覆盖新结果。 - 懒加载节点需设置
hasChildren: true并提供lazyLoad。 height应为正数或可解析的 px 值。

收藏人数:
购买源码授权版(
试用
使用 HBuilderX 导入示例项目
赞赏(0)
下载 1
赞赏 0
下载 12502876
赞赏 1941
赞赏
京公网安备:11010802035340号