☰
从 0.1.7 到 2.0.0:uni-data-picker 级联选择器版本演进全解(hello-uniapp 仓库源码佐证)
2026/10/15 3:40:03 网站建设 项目流程
  • 示例工程
  • 前端

【免费下载链接】hello-uniapp

uni-app框架演示示例

项目地址:https://gitcode.com/gh_mirrors/he/hello-uniapp
点击查看免费下载

本文以 uni-data-picker 组件的完整更新日志 为主线,系统梳理该级联选择器从 0.1.7 版本起步、补齐 v-model 与数据映射能力、三代数据源(本地 / 云端单列 / 云端树形)成型,直至 2.0.0 适配 uni-app-x 的全部演进过程。读完本文,你可以基于版本更新记录快速定位某个属性的引入时间、理解组件底层的数据加载与回显机制(附 hello-uniapp 仓库中的源码与官方示例路径),并在 uni-app 项目中正确配置和排错该组件。

一、组件定位与文件结构

<uni-data-picker>是 uni-ui 体系中的选择类 datacom 组件,支持单列与多列级联选择,列数不限,屏幕显示不全时顶部 tab 区域可左右滚动;候选数据既支持一次性加载,也支持懒加载(例如选中“北京”后动态加载其区县数据)。组件说明 指出它尤其适用于地址选择、分类选择场景,并且可以 JQL 直连 uniCloud 云数据库、配合 DB Schema 使用。

从源码结构看,仓库中的组件由四个核心文件构成:

文件职责
uni-data-picker.vue输入框 + 弹出层外壳,负责触发、回显、事件分发、Vue2/Vue3 双绑定
uni-data-picker.js核心 mixin:定义全部数据属性(props)、云端 JQL 查询构造、树形数据抽取与路径查找
uni-data-pickerview.vue选择视图本体(顶部 tab + 列表),可脱离输入框独立使用
uni-data-picker.uvue / uni-data-picker.uts2.0.0 新增的 uni-app-x(UTS)实现

package.json 中声明了三个依赖组件:uni-load-more(加载指示)、uni-icons(清除图标)、uni-scss(主题变量),这与 changelog 中 0.1.7“调整为 uni_modules 目录规范”和 1.0.0“优化组件 UI,并提供设计资源”的记录相互印证——组件从早期独立目录迁移进了 uni_modules 规范目录并依赖 uni-scss 主题体系。

二、版本演进时间线:先补齐“基础可用”,再演进“数据源能力”

2.1 0.x 系列:确立目录规范与事件模型(2021-02 ~ 2021-06)

  • 0.1.7(2021-02-05)调整为 uni_modules 目录规范:组件文件落入uni_modules/uni-data-picker/components/...结构,支持 HBuilderX 插件体系自动识别与依赖声明(见 package.json 的uni_modules.dependencies字段)。
  • 0.1.8(2021-02-05)优化部分样式在 nvue 上的兼容表现:nvue 与 vue 页面布局模型不同,源码中随处可见/* #ifdef APP-NVUE */条件编译注释(如 uni-data-picker.vue 的弹出层样式),这一系列的 nvue 适配在此后多个版本中反复出现。
  • 0.1.9(2021-03-09)修复微信小程序某些情况下无法选择的问题。
  • 0.2.0(2021-03-15)修复nodeclick、popupopened、popupclosed事件无法触发的问题:这三个事件是组件对外交互的骨架。uni-data-picker.vue 的 emits 声明为:
emits: ['popupopened', 'popupclosed', 'nodeclick', 'input', 'change', 'update:modelValue','inputclick'],

其中show()/hide()分别发出popupopened/popupclosed(源码位置),节点点击经 pickerview 层透传nodeclick(onnodeclick 转发)。0.2.0 之前的事件断链修复,保证了这条透传链路真正可用。

2.2 0.3.x 系列:云端数据源三代演进(2021-04 ~ 2021-06)

这是组件能力扩张最密集的区间:

  • 0.3.0(2021-04-07)新增支持云端非树形表结构数据:在此之前仅支持树形表;同时修复根节点parent_field为 null 时选择界面错乱的问题。
  • 0.3.1 / 0.3.2 / 0.3.4 / 0.3.5:连续修复本地数据概率回显失败、非树形数据带where查询报错、v-model无效、loaddata为空数据组时加载过长、本地数据无法选择带children的 2 级节点等问题。
  • 0.3.3(2021-05-12)新增组件示例地址,即仓库中的>isLocalData() { return !this.collection.length; } isCloudDataList() { return this.isCloudData && (!this.parentField && !this.selfField); } isCloudDataTree() { return this.isCloudData && this.parentField && this.selfField; }

    即:不传collection走本地数据;传了collection但无self-field/parent-field走云端单列(0.3.0 新增的非树形结构);同时提供self-field与parent-field走云端树形。loadData 按这三种类型分发到loadLocalData/loadCloudDataList/loadCloudDataTree。

    2.3 0.4.x 系列:映射、清除、空间配置(2021-09 ~ 2021-10)

    • 0.4.0(2021-07-13)组件兼容 vue3:这是后文“双事件绑定”机制(input+update:modelValue)的起点。
    • 0.4.1(2021-09-15)新增map属性,字段映射:将text/value映射到数据中的其他字段。mixin 中 map 的默认值为{ text: "text", value: "value" },后续 0.4.4“修复上一版本造成的 map 属性失效的 bug”说明该机制早期曾随重构失效,修复后成为贯穿本地/云端两种数据源的统一字段访问方式(如回显时的_updateSelected即按map.text/map.value匹配)。
    • 0.4.2(2021-09-23):新增通过 ref 调用的show/hide方法,以及“选项内容过长自动添加省略号”。
    • 0.4.4(2021-09-26)新增ellipsis属性:控制 tab 选项长度过长时是否自动省略,对应 pickerview 中的.selected-item-text-overflow/.item-text-overflow省略样式(uni-data-pickerview.vue 样式段),vue 侧默认true。
    • 0.4.5(2021-09-26)清除已选项功能:新增clearIcon属性控制是否显示清除按钮,同时提供clear方法,二者等效。输入框模板中,仅当clearIcon && !readonly && inputSelected.length三者同时满足时才渲染uni-icons清除图标;clear 方法 直接以空数组_dispatchEvent([])派发,等效于把值清空。
    • 0.4.6(2021-10-19)修复非 VUE3 v-model 为 0 时无法选中的 bug:涉及“值 0 是否视为有值”的边界判断,mixin 中 hasValue 计算属性对 number 类型直接返回true,即是这一类问题的兜底逻辑之一。
    • 0.4.7(2021-10-25):新增spaceInfo属性用于服务空间配置(HBuilderX 3.2.11+),同时修复树型 uniCloud 数据类型为 int 时报错的 bug。mixin 中 spaceInfo prop 最终在 getCommand 中以uniCloud.database(this.spaceInfo)的形式生效——多端云场景下指定服务空间即依赖此属性。
    • 0.4.8 / 0.4.9(2021-10-27 / 10-28)连续修复 v-model 概率无效问题(后者专门针对 VUE2)。这为 1.x 阶段重构绑定机制埋下伏笔,详见下节。

    2.4 1.0.x ~ 1.1.x 系列:UI 重构与回归修复(2021-11 ~ 2023-04)

    • 1.0.0(2021-11-19)优化组件 UI,并提供设计资源;文档迁移:这是组件外观的一次整体改版,输入框高度、弹出层圆角与阴影、H5 PC 端下拉面板形态(uni-data-picker.vue 中 H5 媒体查询段中min-width: 768px时将弹出层改为position: absolute的下拉框样式)均属这次改版。
    • 1.0.1(2021-11-23)修复由上个版本引发的 map、v-model 等属性不生效的 bug:可见 1.0.0 重构引入过回归。
    • 1.0.2 / 1.0.3(2022-02-25):连续修复“条件编译 nvue 不支持的 css 样式”与“nvue 不支持的 v-show 的 bug”——nvue 不支持v-show指令这一平台差异,在源码中体现为弹出层统一改用v-if="isOpened"(模板中的 cover 与 dialog),两个版本同日发版说明是同一轮回归的连环修复。
    • 1.0.4(2022-04-19)修复字节小程序本地数据无法选择下一级的 Bug。
    • 1.0.5(2022-07-04)修复 uni-data-picker 在 uni-forms-item 中宽度不正确的 bug:组件外层样式 设置flex: 1,配合表单 item 的 flex 布局才能撑满宽度。此外 _dispatchEvent 中还有if (this.formItem) { this.formItem.setValue(item.value) }的显式对接,专门服务于与 uni-forms 联动的场景。
    • 1.0.6(2022-07-05)优化显示样式;1.0.7(2022-07-06)优化 pc 端图标位置不正确的问题——PC 端形态与移动端完全不同(下拉面板而非底部弹窗),需要单独校准清除图标与箭头的排布。
    • 1.0.8(2022-09-16)可以使用 uni-scss 控制主题色:uni-data-pickerview.vue 样式入口 顶部声明$uni-primary: #007aff !default;,选中项下划线、勾号角标(.check)均取用该变量。开发者只要在项目uni.scss中覆盖$uni-primary即可统一换肤。
    • 1.1.0 / 1.0.9(2023-02-15,两版本同日记录)修复 localdata 不支持动态更新的 bug:uni-data-picker.vue 的 watcher 对localdata做deep: true监听并重新load(),正是该修复的直接产物——此前替换本地数据源(如异步拉取后的分类树)不会触发重新回显。
    • 1.1.1(2023-02-21)修复代码合并时引发 value 属性为空时不渲染数据的问题。
    • 1.1.2(2023-04-11)修复更改 modelValue 报错的 bug;修复 v-for 未使用 key 值控制台 warning:package.json 中"version": "2.0.0"之前最后一版,模板内所有v-for均已带:key(如 selected-item 循环)。

    2.5 2.0.0(2023-12-14):新增支持 uni-app-x

    2.0.0 是为数不多的“能力新增”版本:组件以 UTS 重写了 uni-app-x 分支,与 vue 分支并行维护:

    • uni-data-picker.uvue:uvue 模板结构上保留了输入框、遮罩、弹出层三段式,但列表区改用list-view/list-item原生组件替代scroll-view,错误展示改为error!.errMsg结构。
    • uni-data-picker.uts:以defineMixin声明同名的 UTS 版 mixin,localdata类型为Array<UTSJSONObject>,collection/where改为 Object 类型,并新增了gettreepath、startwith、limitlevel(默认 10)、groupby、distinct、foreignKey、loadtime等云端参数定义(GetCommandOptions 类型)。
    • 从源码结构看,UTS 分支的pageSize默认值为20(uni-data-picker.uts),而 vue 分支默认500(uni-data-picker.js)。两个分支的默认分页策略不同,跨端迁移时若依赖默认值拉全量数据需要显式传入pageSize。

    另外,H5 平台还存在一个平台专属文件 keypress.js:整文件包裹在// #ifdef H5条件编译中,监听document.keyup将 Esc、Tab、Enter、方向键等归一化为$emit事件,用于键盘可访问性,仅 H5 编译产物会包含它。

    三、数据源三代机制:以 changelog 0.3.0 / 0.4.7 / 0.4.1 为锚点

    changelog 中 0.3.0 的“新增支持云端非树形表结构数据”和 0.4.x 的树形修复记录,最终沉淀为今天可复制的三类用法。

    3.1 本地数据(树形)

    <uni-data-picker placeholder="请选择班级" popup-title="请选择" :localdata="classDataTree" v-model="classValue" @change="onchange" @nodeclick="onnodeclick" @popupopened="onpopupopened" @popupclosed="onpopupclosed"> </uni-data-picker>
    data() { return { classValue: '1-2', classDataTree: [ { text: '一年级', value: '1-0', children: [ { text: '1.1班', value: '1-1' }, { text: '1.2班', value: '1-2' } ] }, { text: '三年级', value: '3-0', disable: true // 节点级禁用 } ] } }

    以上是仓库><uni-data-picker v-model="nation" collection="opendb-nation-china" field="name as value, name as text" @change="onchange"></uni-data-picker>

    单列模式下没有父子关系,选择任意一项即视为叶子节点,handleNodeClick 中对 isCloudDataList 直接 onSelectedChange(node, true)。回显时,组件会解析field中的as value别名(_getForeignKeyByField)拼出${原字段} == '${dataValue}'的 where 条件(getCloudDataListValue);这正是 0.3.2“修复非树形数据有 where 属性查询报错的问题”之后打磨成熟的逻辑——用户自传的where会以(${this.where}) && (${where})与回显条件做与运算合并。

    3.3 云端树形(self-field + parent-field)

    <uni-data-picker placeholder="请选择地址" popup-title="请选择所在地区" :preload="true" :step-searh="true" self-field="code" parent-field="parent_code" collection="opendb-city-china" orderby="value asc" field="code as value, name as text, eq(type, 2) as isleaf" v-model="address" @change="onchange"></uni-data-picker>

    该写法同样来自 演示页被注释的 Cloud 树形示例。树形模式的关键行为,都能与 changelog 中的修复记录对应上:

    • 懒加载与叶子探测:选中非叶子节点后,组件先尝试用已有数据过滤子级;若无子级则再请求一次服务器确认(loadCloudDataNode 回调分支)。0.4.3“修复某些情况下级联未触发的 bug”即针对该分支。
    • 根节点条件:_cloudDataTreeWhere 对根节点同时判定parentField == null || parentField == "",覆盖 0.3.0 提到的“根节点 parent_field 为 null 界面错乱”一类问题。
    • int 类型值:0.4.7 修复“树型 uniCloud 数据类型为 int 时报错”,当前 _findNodePath 的值比较采用===之外的宽松处理(本地分支使用value === key,云端分支按字符串拼 where),跨类型数据时建议显式使用map或保证 value 类型一致。
    • spaceInfo(0.4.7 新增):多端云/多空间场景下传入服务空间配置对象,见 2.3 节源码说明。

    3.4 完整数据属性一览(mixin 定义值)

    以下默认值全部取自 uni-data-picker.js 的 props 定义,可直接作为排错基线:

    属性类型默认值说明
    localdataArray / Object[]本地数据(树形或扁平),深度监听,变化自动重载(1.1.0 修复后)
    collectionString''uniCloud 表名;为空即本地数据模式
    fieldString''查询字段,多字段逗号分隔,支持as别名
    orderbyString''排序字段及正倒序
    whereString / Object''JQL 查询条件,会与组件内部条件自动合并
    pageCurrentNumber1当前页
    pageSizeNumber500(vue 分支)/20(uvue 分支)每页条数
    getcount/getone/gettreeBooleanfalseJQL get 选项透传
    manualBooleanfalse是否手动模式
    value/modelValueArray / String / Number[]Vue2v-model/ Vue3v-model
    preloadBooleanfalsetrue:点击弹出窗口前先加载数据;false:点开后再加载
    stepSearhBooleantrue分布查询:仅查询当前选中节点的子级;false一次查出全部数据
    selfField/parentFieldString''树形云端数据的自身字段 / 父级字段,两者齐备才走树形模式
    multipleBooleanfalse多选开关
    mapObject{ text: 'text', value: 'value' }字段映射(0.4.1 引入)
    spaceInfoObject{}服务空间配置(0.4.7 引入,HBuilderX 3.2.11+)

    输入框外壳自身的属性定义在 uni-data-picker.vue props 段:popupTitle(默认“请选择”)、placeholder(默认“请选择”)、readonly(默认false)、clearIcon(默认true)、border(默认true)、split(分段分隔符,默认/)、ellipsis(默认true)、heightMobile。其中readonly为true时点击不弹出选择层,仅发出inputclick事件(handleInput),且输入框走 _processReadonly 只读回显路径——0.4.5 中“修复 readonly 为 true 时报错的 bug”即落在该路径上。

    四、v-model 双版本兼容机制:理解 changelog 中 9 次绑定类修复

    changelog 中与v-model直接相关的记录多达 9 条(0.3.4、0.4.6、0.4.8、0.4.9、1.0.1、1.1.1、1.1.2 等),其收敛后的实现是理解该组件行为的关键:

    1. 值的归一化:dataValue 计算属性 优先取modelValue,为空时回退value:
    dataValue() { let isModelValue = Array.isArray(this.modelValue) ? (this.modelValue.length > 0) : (this.modelValue !== null || this.modelValue !== undefined); return isModelValue ? this.modelValue : this.value; }

    Vue3 下v-model编译为modelValue,Vue2 下编译为value,这一层让同一套代码在两个大版本下都能取到“当前绑定值”。

    1. 双事件派发:_dispatchEvent 同时$emit('input', item.value)(Vue2)与$emit('update:modelValue', item.value)(Vue3),并发出change事件,其 payload 形如{ detail: { value: selected } }(selected为整条选中路径数组)。0.4.8/0.4.9 两版“v-model 概率无效”的修复即发生在这条派发链路上;1.0.1 的回归与 1.1.2 的modelValue报错修复则是 1.0.0 UI 重构后的收尾。
    2. 值的粒度:item取selected数组的最后一项,也就是说v-model绑定的值始终是叶子(最后一级)的value;change事件里的detail.value才是完整路径。回显本地数据时,loadLocalData 若收到数组取值也会先取其最后一项再查路径——这与 1.1.1“value 属性为空时不渲染数据”的修复共同保证空值、数组值、数字值(0)都能正确回显。

    五、交互与定制:清除、show/hide、自定义插槽

    • 清除:clearIcon(0.4.5 引入)控制图标显隐,也可通过 ref 调用clear(),二者等效。
    • show / hide(0.4.2 引入):show()打开弹出层并延迟 200ms 后将已有_treeData/selected同步给内部 pickerview(show 方法),hide()关闭并发出popupclosed。
    • 自定义插槽:uni-data-picker.vue 的默认插槽 暴露options、data(当前选中路径)、error三个作用域变量。演示页中“自定义插槽”小节给出了完整写法:
    <uni-data-picker v-slot:default="{ data, error, options }" title="请选择" :localdata="classDataTree" v-model="classValue"> <view class="input-border"> <view v-if="error" class="error"><text>{{ error }}</text></view> <view v-else-if="data.length" class="input-selected"> <view v-for="(item, index) in data" :key="index" class="selected-item"> <text>{{ item.text }}</text> </view> </view> <view v-else><text>请选择</text></view> </view> </uni-data-picker>

    该插槽允许完全接管输入框外观,例如接入表单校验提示(error即来自云端回显失败时的errorMessage)。

    • PC 端形态:H5 下min-width: 768px时弹出层变为锚定在输入框下方的下拉面板(带指示小三角.uni-popper__arrow),移动端则保持底部通栏弹窗(顶部 20% 处)——这与 1.0.6/1.0.7 两版“显示样式”“pc 端图标位置”的优化记录对应。

    六、平台支持、主题与依赖

    package.json 声明的平台矩阵:

    • App:app-vue、app-nvue、app-uvue(uvue 即 2.0.0 新增的 uni-app-x 分支)均为y;
    • Vue:vue2: y、vue3: y;
    • H5:移动端与 PC 端各主流浏览器全量支持;
    • 小程序:微信、阿里、百度、字节跳动、QQ 为y,京东为u(未完全验证);
    • 快应用:华为、联盟均为u;
    • 云服务:腾讯云tcb、阿里云aliyun均为y。

    主题色自 1.0.8 起可用 uni-scss 控制:组件样式使用$uni-primary !default声明(uni-data-pickerview.vue),在 项目根目录的 uni.scss 中覆盖$uni-primary后,选中态下划线、勾选标记即整体换色。组件运行时依赖 uni-load-more(加载指示)、uni-icons(清除图标)与 uni-scss(主题变量),三者均已包含在 hello-uniapp 仓库的uni_modules目录中,可直接查看其实现。

    七、完整版本更新记录(changelog 原文整理)

    以下表格完整收录 changelog.md 的全部条目,便于按版本快速检索:

    版本日期更新内容
    2.0.02023-12-14新增 支持 uni-app-x
    1.1.22023-04-11修复 更改 modelValue 报错的 bug;修复 v-for 未使用 key 值控制台 warning
    1.1.12023-02-21修复代码合并时引发 value 属性为空时不渲染数据的问题
    1.1.02023-02-15修复 localdata 不支持动态更新的 bug
    1.0.92023-02-15修复 localdata 不支持动态更新的 bug
    1.0.82022-09-16可以使用 uni-scss 控制主题色
    1.0.72022-07-06优化 pc 端图标位置不正确的问题
    1.0.62022-07-05优化 显示样式
    1.0.52022-07-04修复 uni-data-picker 在 uni-forms-item 中宽度不正确的 bug
    1.0.42022-04-19修复 字节小程序 本地数据无法选择下一级的 Bug
    1.0.32022-02-25修复 nvue 不支持的 v-show 的 bug
    1.0.22022-02-25修复 条件编译 nvue 不支持的 css 样式
    1.0.12021-11-23修复 由上个版本引发的 map、v-model 等属性不生效的 bug
    1.0.02021-11-19优化 组件 UI,并提供设计资源;文档迁移
    0.4.92021-10-28修复 VUE2 v-model 概率无效的 bug
    0.4.82021-10-27修复 v-model 概率无效的 bug
    0.4.72021-10-25新增 属性 spaceInfo 服务空间配置(HBuilderX 3.2.11+);修复 树型 uniCloud 数据类型为 int 时报错的 bug
    0.4.62021-10-19修复 非 VUE3 v-model 为 0 时无法选中的 bug
    0.4.52021-09-26新增 清除已选项功能(clearIcon 属性 + clear 方法,二者等效);修复 readonly 为 true 时报错的 bug
    0.4.42021-09-26修复 上一版本造成的 map 属性失效的 bug;新增 ellipsis 属性,支持配置 tab 选项长度过长时是否自动省略
    0.4.32021-09-24修复 某些情况下级联未触发的 bug
    0.4.22021-09-23新增 提供 show 和 hide 方法,可通过 ref 调用;新增 选项内容过长自动添加省略号
    0.4.12021-09-15新增 map 属性 字段映射,将 text/value 映射到数据中的其他字段
    0.4.02021-07-13组件兼容 vue3
    0.3.52021-06-04修复 无法加载云端数据的问题
    0.3.42021-05-28修复 v-model 无效问题;修复 loaddata 为空数据组时加载时间过长问题;修复 本地数据无法选择带有 children 的 2 级节点
    0.3.32021-05-12新增 组件示例地址
    0.3.22021-04-22修复 非树形数据有 where 属性查询报错的问题
    0.3.12021-04-15修复 本地数据概率无法回显时问题
    0.3.02021-04-07新增 支持云端非树形表结构数据;修复 根节点 parent_field 字段等于 null 时选择界面错乱问题
    0.2.02021-03-15修复 nodeclick、popupopened、popupclosed 事件无法触发的问题
    0.1.92021-03-09修复 微信小程序某些情况下无法选择的问题
    0.1.82021-02-05优化 部分样式在 nvue 上的兼容表现
    0.1.72021-02-05调整为 uni_modules 目录规范

    注:changelog 原文中 1.0.9 与 1.1.0 同日(2023-02-15)各有一条“修复 localdata 不支持动态更新的 bug”记录,此处按原文保留。

    八、结语

    从这份更新记录可以清晰读出 uni-data-picker 的能力成型路径:0.1.x 打目录与事件地基 → 0.3.x 补齐云端三代数据源 → 0.4.x 打磨 map/clearIcon/spaceInfo 等工程属性并兼容 Vue3 → 1.x 完成 UI 改版与跨端(nvue/字节小程序/PC)回归收敛 → 2.0.0 以 UTS 重写覆盖 uni-app-x。排查该组件的问题时,最实用的方法是:先根据 changelog 对照项目中的组件版本确认“该问题是否已被修复”、所需属性“从哪个版本开始可用”,再结合 mixin 数据层、pickerview 交互层 与 演示页 定位具体实现。

    • 示例工程
    • 前端

    【免费下载链接】hello-uniapp

    uni-app框架演示示例

    项目地址:https://gitcode.com/gh_mirrors/he/hello-uniapp
    点击查看免费下载
    上一篇:Composio 集成 TikTok 完整指南:自有开发者应用、OAuth 排错与自定义 Scope 配置
    下一篇:Karakeep 搜索查询语言完整指南:从基础语法到源码级实现解析

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询