你的下拉框点了没反应?多半是只做了一半
很多人第一次用 Select,做出来的下拉框点开能看到几个选项,选完却发现页面毫无变化,数据也没存下来。于是怀疑是不是组件有 bug。其实组件没问题,是你只做了一半:你把它当成了一个会展开的静态文本,而漏掉了它真正的灵魂,选中之后的那个回调。
在华为鸿蒙系统的 ArkUI 框架里,Select 从来不是一个标签,它是一个完整的交互组件:选项是数据喂进去的,选中会触发回调,回调再驱动页面更新。今天用华为仓颉编程语言把这条链路讲透,你的下拉框就能真正动起来。
Select 的选项是数据,不是写死的文字
先纠正第一个认知。Select 的选项不是你一行行硬写的文本,而是一个数据数组喂进去的。构造时它接收一个 SelectOption 的数组:
Select([ SelectOption(value: "北京"), SelectOption(value: "上海"), SelectOption(value: "广州") ])
每一个 SelectOption 就是一个选项,最关键的属性是 `value`,也就是这一项显示的文字。因为选项是数据,所以它们完全可以来自接口返回、来自数据库查询,而不是写死在界面里。这是它和静态文本最本质的区别:静态文本是固定的,Select 的选项是动态的。

给选项加图标,下拉菜单立刻有质感
SelectOption 还有第二个属性,叫 `icon`,可以给每个选项配一个小图标。
Select([ SelectOption(value: "微信", icon: @r(app.media.wechat)), SelectOption(value: "支付宝", icon: @r(app.media.alipay)) ])
别小看这个图标。一个纯文字的下拉菜单和一个图文并茂的下拉菜单,质感差距很明显。做支付方式选择、分类筛选这种场景,给每项配个图标,专业度立刻提升。`value` 和 `icon` 都接受资源类型,用 `@r` 引用就行。
onSelect:这才是 Select 的灵魂
现在讲最重要的部分,也是大多数人漏掉的部分。用户选了某一项之后,怎么知道他选了什么?答案是 `onSelect` 回调。
它的回调类型是 `(Int32, String) -> Unit`,意思是每次选中,它都会把两样东西交给你:选中项的索引和选中项的文本。
Select([ SelectOption(value: "北京"), SelectOption(value: "上海") ]) .onSelect({ index: Int32, text: String => this.selectedCity = text })
这就是整个组件的灵魂所在。没有 `onSelect`,下拉框就只是个摆设,点了等于没点。有了它,你才能拿到用户的选择,接下来才谈得上保存、跳转、刷新。记住一句话:Select 会不会动,全看你有没有写 `onSelect`。

用 @State 让选择真正改变页面
拿到了选中的值,还要让页面跟着变,这一步靠状态变量。
把选中结果存进一个 `@State` 变量,页面上凡是绑定了这个变量的地方都会自动刷新:
@State var selectedCity: String = "请选择城市" func build() { Column { Text(this.selectedCity).fontSize(20) Select([ SelectOption(value: "北京"), SelectOption(value: "上海") ]) .value(this.selectedCity) .onSelect({ _: Int32, text: String => this.selectedCity = text }) } }
这里用到两个配套属性。`value` 设置下拉按钮本身显示的文字,选中后会自动替换成所选项;`selected` 则能设置初始默认选中第几项,索引从 0 开始,不设置就是不选中。一旦把选中值写进 `@State`,上面的 Text 和下拉按钮就会同步更新。到这一步,下拉框才算真正活了。

把样式调好看:选中项也要有存在感
功能跑通后,再来雕琢样式。Select 的样式分两层:按钮本身和下拉菜单里的选项。
按钮本身用 `font` 调字体、`fontColor` 调颜色。下拉菜单里被选中的那一项,可以用 `selectedOptionFont` 单独设字体、用 `selectedOptionBgColor` 设背景色,让当前选中项更突出:
Select(this.options) .font(size: 16.vp, weight: FontWeight.W500) .fontColor(0x182431) .selectedOptionFont(size: 16.vp, weight: FontWeight.W400) .selectedOptionBgColor(0xF0F0F0)
为什么要专门强调选中项的样式?因为用户重新打开下拉菜单时,一眼就能看到自己上次选的是哪个,这是个很重要的体验细节,很多人会忽略。
调整菜单的位置和宽度
最后是布局微调。下拉菜单弹出的位置、宽窄,都能控制。
`arrowPosition` 控制小箭头在文字的哪一侧;`menuAlign` 控制菜单相对按钮的对齐方式;`optionWidth` 和 `optionHeight` 分别设置弹出菜单的宽和高。选项文字长短不一时,固定一个 `optionWidth` 能让菜单看起来更整齐:
Select(this.options) .arrowPosition(ArrowPosition.End) .optionWidth(200)
这些属性不是必须的,但调好了能让下拉菜单贴合你的页面布局,不会弹得歪歪扭扭。
小结:一条完整的交互链路
回头梳理一下,一个真正可用的 Select 是这样一条链路:用数据数组喂进选项,用 `selected` 设默认值,用 `onSelect` 接住用户的选择,再把结果写进 `@State` 驱动页面更新,最后用样式属性把它打磨好看。

别再把 Select 当静态文本了。它的价值不在于展示,而在于交互。把 `onSelect` 加上、把状态接通,你就从一个会摆组件的人,变成了一个会做交互的人。

夜雨聆风