更新记录

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,也可以按项目规范自动引入。

数据结构

默认字段为 valuelabelchildren。业务字段不同可通过 valueKeylabelKeychildrenKey 指定。

type SelectOption = {
  value: string | number
  label: string
  pinyin?: string
  spell?: string
  disabled?: boolean
  hasChildren?: boolean
  children?: SelectOption[]
}

组件不内置中文转拼音字典,以控制包体积。建议服务端或数据构建阶段预写 pinyinspell 字段。

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(),未使用 windowdocument 或直接 DOM API。Vue 2 项目不支持本组件,请使用 Vue 3 项目模板。

使用约束

  • 树形数据的 value 建议全局唯一。
  • 异步 remoteSearch 应返回数组,组件会用请求序号避免慢请求覆盖新结果。
  • 懒加载节点需设置 hasChildren: true 并提供 lazyLoad
  • height 应为正数或可解析的 px 值。

隐私、权限声明

1. 本插件需要申请的系统权限列表:

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集任何用户数据,不向外部服务器发送数据

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

暂无用户评论。