- 示例工程
- 前端
【免费下载链接】hello-uniapp
uni-app框架演示示例
本文以 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.uts | 2.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 查询条件,会与组件内部条件自动合并 pageCurrentNumber 1当前页 pageSizeNumber 500(vue 分支)/20(uvue 分支)每页条数 getcount/getone/gettreeBoolean falseJQL get 选项透传 manualBoolean false是否手动模式 value/modelValueArray / String / Number []Vue2 v-model/ Vue3v-modelpreloadBoolean falsetrue:点击弹出窗口前先加载数据;false:点开后再加载stepSearhBoolean true分布查询:仅查询当前选中节点的子级; false一次查出全部数据selfField/parentFieldString ''树形云端数据的自身字段 / 父级字段,两者齐备才走树形模式 multipleBoolean false多选开关 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 等),其收敛后的实现是理解该组件行为的关键:- 值的归一化: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,这一层让同一套代码在两个大版本下都能取到“当前绑定值”。- 双事件派发:_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 重构后的收尾。 - 值的粒度:
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.0 2023-12-14 新增 支持 uni-app-x 1.1.2 2023-04-11 修复 更改 modelValue 报错的 bug;修复 v-for 未使用 key 值控制台 warning 1.1.1 2023-02-21 修复代码合并时引发 value 属性为空时不渲染数据的问题 1.1.0 2023-02-15 修复 localdata 不支持动态更新的 bug 1.0.9 2023-02-15 修复 localdata 不支持动态更新的 bug 1.0.8 2022-09-16 可以使用 uni-scss 控制主题色 1.0.7 2022-07-06 优化 pc 端图标位置不正确的问题 1.0.6 2022-07-05 优化 显示样式 1.0.5 2022-07-04 修复 uni-data-picker 在 uni-forms-item 中宽度不正确的 bug 1.0.4 2022-04-19 修复 字节小程序 本地数据无法选择下一级的 Bug 1.0.3 2022-02-25 修复 nvue 不支持的 v-show 的 bug 1.0.2 2022-02-25 修复 条件编译 nvue 不支持的 css 样式 1.0.1 2021-11-23 修复 由上个版本引发的 map、v-model 等属性不生效的 bug 1.0.0 2021-11-19 优化 组件 UI,并提供设计资源;文档迁移 0.4.9 2021-10-28 修复 VUE2 v-model 概率无效的 bug 0.4.8 2021-10-27 修复 v-model 概率无效的 bug 0.4.7 2021-10-25 新增 属性 spaceInfo 服务空间配置(HBuilderX 3.2.11+);修复 树型 uniCloud 数据类型为 int 时报错的 bug 0.4.6 2021-10-19 修复 非 VUE3 v-model 为 0 时无法选中的 bug 0.4.5 2021-09-26 新增 清除已选项功能(clearIcon 属性 + clear 方法,二者等效);修复 readonly 为 true 时报错的 bug 0.4.4 2021-09-26 修复 上一版本造成的 map 属性失效的 bug;新增 ellipsis 属性,支持配置 tab 选项长度过长时是否自动省略 0.4.3 2021-09-24 修复 某些情况下级联未触发的 bug 0.4.2 2021-09-23 新增 提供 show 和 hide 方法,可通过 ref 调用;新增 选项内容过长自动添加省略号 0.4.1 2021-09-15 新增 map 属性 字段映射,将 text/value 映射到数据中的其他字段 0.4.0 2021-07-13 组件兼容 vue3 0.3.5 2021-06-04 修复 无法加载云端数据的问题 0.3.4 2021-05-28 修复 v-model 无效问题;修复 loaddata 为空数据组时加载时间过长问题;修复 本地数据无法选择带有 children 的 2 级节点 0.3.3 2021-05-12 新增 组件示例地址 0.3.2 2021-04-22 修复 非树形数据有 where 属性查询报错的问题 0.3.1 2021-04-15 修复 本地数据概率无法回显时问题 0.3.0 2021-04-07 新增 支持云端非树形表结构数据;修复 根节点 parent_field 字段等于 null 时选择界面错乱问题 0.2.0 2021-03-15 修复 nodeclick、popupopened、popupclosed 事件无法触发的问题 0.1.9 2021-03-09 修复 微信小程序某些情况下无法选择的问题 0.1.8 2021-02-05 优化 部分样式在 nvue 上的兼容表现 0.1.7 2021-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相关推荐
hello-uniapp 中的 uni-data-checkbox 版本演进:从数据驱动单选复选框到 uni-forms、uni-scss 深度集成
hello uniapp 中的 uni data checkbox 版本演进:从数据驱动单选复选框到 uni forms、uni scss 深度集成 本文基于
示例工程前端解析 uni-collapse 折叠面板的版本演进:基于 hello-uniapp 仓库的源码实现与实战验证
解析 uni collapse 折叠面板的版本演进:基于 hello uniapp 仓库的源码实现与实战验证 本文以 hello uniapp 仓库中 uni
示例工程前端RenderCV 版本演进全解:从 v0.1 到 v2.8 的 Changelog 深度解读与源码佐证
RenderCV 版本演进全解:从 v0.1 到 v2.8 的 Changelog 深度解读与源码佐证 本文以 docs/changelog.md https:
开发工具CLI
上一篇:Composio 集成 TikTok 完整指南:自有开发者应用、OAuth 排错与自定义 Scope 配置下一篇:Karakeep 搜索查询语言完整指南:从基础语法到源码级实现解析 - 0.4.0(2021-07-13)组件兼容 vue3:这是后文“双事件绑定”机制(
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考