HarmonyOS ArkUI Select 与 TextPicker 选择器:下拉、滚筒与省市联动
系列鸿蒙 HarmonyOS 6.1 新特性实战 · 第 38 篇Select下拉选择器和 TextPicker滚筒选择器是两种互补的选择组件Select 适合选项多、界面紧凑的场景TextPicker 适合连续值或较少选项的滚动选择。本篇还演示了用两个 Select 联动实现省市级联的实用模式。运行效果初始状态展示 Select 下拉和 TextPicker 滚筒点击城市 Select 展开下拉列表一、Select 下拉选择器private cities: SelectOption[] [ { value: 北京 }, { value: 上海 }, { value: 广州 }, { value: 深圳 }, { value: 成都 }, { value: 杭州 } ] State selectedCity: number 0 Select(this.cities) .selected(this.selectedCity) .value(this.cities[this.selectedCity].value as string) // 显示当前选中项 .font({ size: 15 }) .fontColor(#333) .selectedOptionBgColor(#e8f0ff) // 已选项背景色 .selectedOptionFontColor(#0066ff) // 已选项文字色 .onSelect((idx: number) { this.selectedCity idx })注意属性名是selectedOptionBgColor不是selectedOptionBackgroundColorselectedOptionFontColor也没有驼峰缩写问题但实测optionBgColor不存在可以在 DevEco 中.触发自动补全确认可用属性。二、TextPicker 滚筒选择器private hours: string[] [00, 06, 08, 09, 10, 12, 14, 16, 18, 20, 22, 23] State timePickerIdx: number 1 State textPickerVal: string TextPicker({ range: this.hours, selected: this.timePickerIdx }) .onChange((val: string | string[], idx: number | number[]) { if (typeof val string) { this.textPickerVal val this.timePickerIdx typeof idx number ? idx : 0 } }) Text(选中时刻 (this.textPickerVal.length 0 ? this.textPickerVal : this.hours[this.timePickerIdx]) :00) .fontSize(16).fontColor(#0066ff).fontWeight(FontWeight.Bold)回调类型注意onChange的参数类型是string | string[]联合类型单列选择时是string需要类型判断后使用。三、省市联动Select 级联用两个 Select 联动实现省市两级选择private provinces: string[] [广东省, 浙江省, 四川省] private provinceCities: string[][] [ [广州市, 深圳市, 佛山市, 东莞市], [杭州市, 宁波市, 温州市], [成都市, 绵阳市, 德阳市] ] State cascadeProvince: number 0 State cascadeCity: number 0 Row({ space: 8 }) { // 省份 Select Select(this.provinces.map((p: string): SelectOption ({ value: p }))) .selected(this.cascadeProvince) .value(this.provinces[this.cascadeProvince]) .font({ size: 14 }).layoutWeight(1) .onSelect((idx: number) { this.cascadeProvince idx this.cascadeCity 0 // 切换省份时重置城市 }) // 城市 Select根据省份动态变化 Select(this.provinceCities[this.cascadeProvince].map((c: string): SelectOption ({ value: c }))) .selected(this.cascadeCity) .value(this.provinceCities[this.cascadeProvince][this.cascadeCity]) .font({ size: 14 }).layoutWeight(1) .onSelect((idx: number) { this.cascadeCity idx }) }关键点城市 Select 的数据源this.provinceCities[this.cascadeProvince]是响应式的省份变化时自动更新城市列表。完整代码Entry Component struct Index { State selectedCity: number 0 State selectedFruit: number 0 State textPickerVal: string State timePickerIdx: number 1 State cascadeProvince: number 0 State cascadeCity: number 0 private cities: SelectOption[] [ { value: 北京 }, { value: 上海 }, { value: 广州 }, { value: 深圳 }, { value: 成都 }, { value: 杭州 } ] private fruits: SelectOption[] [ { value: 苹果 }, { value: 香蕉 }, { value: 橙子 }, { value: 葡萄 }, { value: 草莓 } ] private hours: string[] [00, 06, 08, 09, 10, 12, 14, 16, 18, 20, 22, 23] private provinces: string[] [广东省, 浙江省, 四川省] private provinceCities: string[][] [ [广州市, 深圳市, 佛山市, 东莞市], [杭州市, 宁波市, 温州市], [成都市, 绵阳市, 德阳市] ] build() { Scroll() { Column({ space: 20 }) { Text(Select 与 TextPicker 选择器) .fontSize(22).fontWeight(FontWeight.Bold).fontColor(#1a1a1a) // Select Column({ space: 10 }) { Text(一、Select 下拉选择器).fontSize(15).fontWeight(FontWeight.Bold).fontColor(#333) Row({ space: 12 }) { Text(城市).fontSize(14).fontColor(#555).width(50) Select(this.cities) .selected(this.selectedCity) .value(this.cities[this.selectedCity].value as string) .font({ size: 15 }).fontColor(#333) .selectedOptionBgColor(#e8f0ff).selectedOptionFontColor(#0066ff) .onSelect((idx: number) { this.selectedCity idx }) .layoutWeight(1) } .width(100%).alignItems(VerticalAlign.Center) Text(已选${this.cities[this.selectedCity].value}) .fontSize(14).fontColor(#0066ff).fontWeight(FontWeight.Bold) } .padding(12).backgroundColor(#fff).borderRadius(8).width(100%) .border({ width: 1, color: #e0e0e0 }).alignItems(HorizontalAlign.Start) // TextPicker Column({ space: 10 }) { Text(二、TextPicker 滚筒选择器).fontSize(15).fontWeight(FontWeight.Bold).fontColor(#333) TextPicker({ range: this.hours, selected: this.timePickerIdx }) .onChange((val: string | string[], idx: number | number[]) { if (typeof val string) { this.textPickerVal val this.timePickerIdx typeof idx number ? idx : 0 } }) Text(选中时刻 (this.textPickerVal.length 0 ? this.textPickerVal : this.hours[this.timePickerIdx]) :00) .fontSize(16).fontColor(#0066ff).fontWeight(FontWeight.Bold) } .padding(12).backgroundColor(#fff).borderRadius(8).width(100%) .border({ width: 1, color: #e0e0e0 }).alignItems(HorizontalAlign.Start) // 省市联动 Column({ space: 10 }) { Text(三、省市联动Select 级联).fontSize(15).fontWeight(FontWeight.Bold).fontColor(#333) Row({ space: 8 }) { Select(this.provinces.map((p: string): SelectOption ({ value: p }))) .selected(this.cascadeProvince).value(this.provinces[this.cascadeProvince]) .font({ size: 14 }).layoutWeight(1) .onSelect((idx: number) { this.cascadeProvince idx; this.cascadeCity 0 }) Select(this.provinceCities[this.cascadeProvince].map((c: string): SelectOption ({ value: c }))) .selected(this.cascadeCity) .value(this.provinceCities[this.cascadeProvince][this.cascadeCity]) .font({ size: 14 }).layoutWeight(1) .onSelect((idx: number) { this.cascadeCity idx }) } .width(100%).alignItems(VerticalAlign.Center) Text(选中${this.provinces[this.cascadeProvince]} ${this.provinceCities[this.cascadeProvince][this.cascadeCity]}) .fontSize(14).fontColor(#0066ff).fontWeight(FontWeight.Bold) } .padding(12).backgroundColor(#fff).borderRadius(8).width(100%) .border({ width: 1, color: #e0e0e0 }).alignItems(HorizontalAlign.Start) } .padding(20).width(100%) } .width(100%).height(100%).backgroundColor(#f5f5f5) } }API 速查组件/属性说明Select(options: SelectOption[])下拉选择options 为{value: string}[].selected(idx)初始选中索引.value(显示文字)未展开时显示的文本.selectedOptionBgColor(#e8f0ff)已选项背景色.selectedOptionFontColor(#0066ff)已选项文字色.onSelect((idx: number) {})选中回调TextPicker({ range: string[], selected: idx })滚筒选择.onChange((val, idx) {})滚动变化回调val 是string | string[]小结属性名要精确selectedOptionBgColor而非selectedOptionBackgroundColor用 DevEco 自动补全确认TextPicker onChange 处理联合类型typeof val string判断后再使用级联靠响应式数据城市 Select 的 range 直接用this.provinceCities[province]省份变化自动刷新切换父级别时重置子级索引this.cascadeCity 0防止越界上一篇DatePicker / TimePicker 完全指南 | 下一篇Badge 徽标与 Chip 标签组件

相关新闻

日志系统的设计:从 console.log 到结构化日志

日志系统的设计:从 console.log 到结构化日志

日志系统的设计:从 console.log 到结构化日志 一、console.log 在什么时候不够用 开发阶段,console.log 是最直接的调试工具。打印请求参数、输出中间结果,在本地跑一下就知道发生了什么。这个习惯在部署到生产环境后,往往延续下来——生产代码里依然充斥着 console…

2026/7/25 4:02:48 阅读更多 →
AI外贸获客系统:企业如何利用AI提升海外客户开发效率?

AI外贸获客系统:企业如何利用AI提升海外客户开发效率?

随着全球贸易环境不断变化,外贸企业正在寻找更加高效的客户开发方式。过去,外贸企业主要依靠人工完成客户开发流程。销售人员寻找目标市场。销售人员收集客户资料。销售人员联系潜在客户。销售人员持续跟进合作机会。这种方式长期以来发挥了重要作用。但…

2026/7/21 15:20:55 阅读更多 →
终极指南:3个核心技巧免费解锁Wand专业版完整功能

终极指南:3个核心技巧免费解锁Wand专业版完整功能

终极指南:3个核心技巧免费解锁Wand专业版完整功能 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/GitHub_Trending/we/Wand-Enhancer 你是否曾因游戏修改工具的功能限制而…

2026/7/23 7:36:24 阅读更多 →

最新新闻

AI审AI:GitLab上线AI代码审查,开发者可以松一口气了吗?

AI审AI:GitLab上线AI代码审查,开发者可以松一口气了吗?

AI审AI:GitLab上线AI代码审查,开发者可以松一口气了吗? 《AI视界——从资讯看技术》专栏 第十七期 当AI生成的代码越来越多,人工审查越来越跟不上,行业给出了一个看似完美的方案:让AI来审查AI。但这到底是…

2026/7/26 5:01:06 阅读更多 →
Linux(CentOS)系统管理入门笔记(第十二期)——系统管理工具与软件包管理(上篇):Cockpit 与 RPM 包管理

Linux(CentOS)系统管理入门笔记(第十二期)——系统管理工具与软件包管理(上篇):Cockpit 与 RPM 包管理

Linux(CentOS)系统管理入门笔记(第十二期)——系统管理工具与软件包管理(上篇):Cockpit 与 RPM 包管理 Linux系统管理入门系列更多文章欢迎访问: Linux入门——系统管理1、Linux入门…

2026/7/26 5:01:06 阅读更多 →
OMAP543x DVFS设计解析:电压域、OPP与动态功耗管理实战

OMAP543x DVFS设计解析:电压域、OPP与动态功耗管理实战

1. OMAP543x DVFS设计思路与核心价值在嵌入式系统,尤其是移动多媒体处理器的开发中,功耗和性能的平衡是永恒的核心议题。OMAP543x作为德州仪器(TI)当年面向高端智能手机和平板电脑推出的双核Cortex-A15应用处理器,其电…

2026/7/26 5:01:06 阅读更多 →
GPT-6越狱攻击被GLM 5.2检测:AI模型安全防护技术解析

GPT-6越狱攻击被GLM 5.2检测:AI模型安全防护技术解析

AI圈今天最大的瓜:GPT-6越狱攻击,被GLM 5.2揪出了最近AI安全圈爆出重磅消息,GPT-6在测试阶段遭遇越狱攻击,而这一安全隐患被GLM 5.2成功检测并曝光。这一事件不仅揭示了大型语言模型面临的安全挑战,也展示了国产大模型…

2026/7/26 5:01:06 阅读更多 →
Vulkan图形API入门:从环境配置到核心概念解析

Vulkan图形API入门:从环境配置到核心概念解析

1. 项目概述:为什么是Vulkan?如果你是一名C开发者,并且对计算机图形学感兴趣,那么“Vulkan”这个名字对你来说一定不陌生。它不像OpenGL那样有着几十年的历史包袱,也不像DirectX那样与特定平台深度绑定。Vulkan是一个由…

2026/7/26 5:01:06 阅读更多 →
大模型蒸馏技术:从原理到实践

大模型蒸馏技术:从原理到实践

1. 大模型蒸馏技术概述大模型蒸馏(Model Distillation)是近年来自然语言处理领域的重要技术突破,它通过知识迁移的方式将超大语言模型(如235B参数模型)的能力"浓缩"到小型模型(如0.6B参数模型&am…

2026/7/26 5:00:06 阅读更多 →

日新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/26 0:00:31 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/26 0:00:31 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/26 0:00:31 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/26 0:00:31 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/26 0:00:31 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/26 0:00:31 阅读更多 →

月新闻