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 标签组件

相关新闻

2026年半封闭丝杆模组怎么选?哪家才是你的最佳之选?

2026年半封闭丝杆模组怎么选?哪家才是你的最佳之选?

在工业自动化飞速发展的今天,半封闭丝杆模组作为关键部件,其性能直接影响着生产效率和产品质量。面对市场上众多的品牌和型号,该如何做出选择呢?接下来,让我们一起探讨一下。精度性能:启英模组更胜一筹很多…

2026/7/18 22:14:50阅读更多 →
【无人机控制】基于MATLAB模拟六自由度四旋翼无人飞行器(UAV)的飞行动力学与控制

【无人机控制】基于MATLAB模拟六自由度四旋翼无人飞行器(UAV)的飞行动力学与控制

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、算法改进、程序设计科研仿真。🍎完整代码获取 定制创新 论文复现私信🍊个人信条:做科研,博学之、审问之、慎思之、明辨之、…

2026/7/18 22:14:50阅读更多 →
微片激光器:引领LIBS技术迈向现场化与智能化的新引擎

微片激光器:引领LIBS技术迈向现场化与智能化的新引擎

一、LIBS技术原理与传统光源瓶颈 依托于对高能的激光脉冲的作用下,在样品的表面就能产生出丰富的等离子体,从而通过对等离子体的发射光谱的高灵敏度的分析直接对样品的元素组成及其相对的丰度等的“指纹”信息得以迅速的、全面的、无损的获取。其 LIBS 系…

2026/7/18 22:14:50阅读更多 →
大模型想要稳定应用,离不开训练与推理两套算力体系

大模型想要稳定应用,离不开训练与推理两套算力体系

生成式 AI 掀起新一轮数字产业变革,智能算力从前沿概念转变为实体经济刚需。纵观整个 AI 算力产业链,两大趋势清晰可见:一是高密度智算集群持续规模化建设;二是算力商业模式持续迭代,Token标准化服务快速普及&#xff…

2026/7/18 23:45:03阅读更多 →
大家好,我是UWA GPM「小Q」,今天是我加入项目的第一天

大家好,我是UWA GPM「小Q」,今天是我加入项目的第一天

大家好,我是 UWA GPM 小Q,今天正式到岗! 各位游戏研发的小伙伴们,大家好~ 我是今天刚入职的新同事小Q,你的AI质量经理。 按新人的规矩,先交代三个“不”:我不占工位,不…

2026/7/18 23:45:03阅读更多 →
快手视频下载神器KS-Downloader:三步搞定无水印高清下载

快手视频下载神器KS-Downloader:三步搞定无水印高清下载

快手视频下载神器KS-Downloader:三步搞定无水印高清下载 【免费下载链接】KS-Downloader 快手(KuaiShou)作品视频/图片下载工具 项目地址: https://gitcode.com/gh_mirrors/ks/KS-Downloader 还在为无法保存喜欢的快手视频而烦恼吗&am…

2026/7/18 23:45:03阅读更多 →
如何创建吸引流量的运动商城网站?

如何创建吸引流量的运动商城网站?

当下运动消费市场持续升温,运动装备、健身器材、运动周边、场馆耗材等产品需求稳步上涨。很多运动实体店、体育商户、场馆经营者,都想搭建专属运动商城网站,打通线上销售渠道。但多数自建商城存在流量少、曝光低、转化差、功能杂乱等问题&…

2026/7/18 23:45:03阅读更多 →
瑞德克斯的页面秩序感有没有条理?

瑞德克斯的页面秩序感有没有条理?

把页面秩序感有没有条理放进真实使用情境里观察,瑞德克斯是否重视基础感受就会更清楚。像调整账户信息设置这种步骤,最能体现平台是否把安全提醒和操作说明安排得稳妥。这些细节拼在一起,才构成瑞德克斯比较自然、也比较稳健的整体印象。从另…

2026/7/18 23:45:03阅读更多 →
记录一次种牙:半年后的真实感受

记录一次种牙:半年后的真实感受

种完牙半年了,记录一下感受。种之前缺了一颗牙好几年,一直拖着。主要是怕疼、怕花钱、怕折腾。后来旁边的牙开始歪了,才下定决心。种之后最大的变化是吃饭方便了。以前缺牙的地方不敢嚼,现在两边都能正常用。恢复比想象中快&#…

2026/7/18 23:43:03阅读更多 →
VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异当你在VSCode中启动一个新的TypeScript项目时,第一个技术决策往往从安装方式开始。这个看似简单的选择——全局安装还是项目本地安装——实际上会深刻影响你的开发流程、团队协作和…

2026/7/18 10:49:13阅读更多 →
智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 智慧树刷课插件是一款专为智慧树在线教育平台设计的Chrome浏…

2026/7/18 8:49:08阅读更多 →
Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否在GOG或Epic Games Store购买了心仪的游戏…

2026/7/18 14:49:24阅读更多 →
从模糊意图到可执行指令:Claude PRD中Prompt Engineering与需求颗粒度的5级映射法则

从模糊意图到可执行指令:Claude PRD中Prompt Engineering与需求颗粒度的5级映射法则

更多请点击: https://kaifayun.com 第一章:从模糊意图到可执行指令:Claude PRD中Prompt Engineering与需求颗粒度的5级映射法则 在Claude驱动的产品需求文档(PRD)生成实践中,原始业务意图往往以自然语言片…

2026/7/18 0:00:14阅读更多 →
Cursor配置生成失效?3大隐藏陷阱+4行修复代码,资深工程师连夜整理的紧急补救清单

Cursor配置生成失效?3大隐藏陷阱+4行修复代码,资深工程师连夜整理的紧急补救清单

更多请点击: https://codechina.net 第一章:Cursor配置生成失效?3大隐藏陷阱4行修复代码,资深工程师连夜整理的紧急补救清单 Cursor 配置生成突然失效,是近期高频报障场景。表面看是 cursor.config.json 未更新或 LSP…

2026/7/18 0:00:14阅读更多 →
某智驾大牛创业

某智驾大牛创业

作者:钟声编辑:Mark出品:红色星际头图:智能驾驶图片据悉,国内某头部智驾公司端到端模型技术大牛Z投身创业,并且已经拿到融资。Z不仅是该头部公司内部最年轻的对标阿里P10级别技术负责⼈,更是业内…

2026/7/18 0:00:14阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/18 22:49:46阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/18 14:49:24阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/18 18:49:35阅读更多 →