ArkUI Select:下拉一收,页面立刻清爽

举报
蓝瘦的蜕变 发表于 2026/09/01 18:22:02 2026/09/01
【摘要】 这篇我们看 Select。 有些选项不值得全部摊在页面上。比如“轻量、标准、完整”,如果每个地方都平铺按钮,页面很快就会变挤。Select 的价值就是把这类短选项收起来,让页面先保持干净。 这个 Demo 只展示 Select 本身:选项数组、默认选中、按钮显示文案、选项文字样式和禁用态。不写 onSelect,也不做

ArkUI Select:下拉一收,页面立刻清爽

这篇我们看 Select

有些选项不值得全部摊在页面上。比如“轻量、标准、完整”,如果每个地方都平铺按钮,页面很快就会变挤。Select 的价值就是把这类短选项收起来,让页面先保持干净。

这个 Demo 只展示 Select 本身:选项数组、默认选中、按钮显示文案、选项文字样式和禁用态。不写 onSelect,也不做状态同步。

参考文档:

  • https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkui
  • https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-ui-development

选项从数组开始

Select 接收一个选项数组,每一项至少有 value

Select([{ value: '轻量' }, { value: '标准' }, { value: '完整' }])
  .selected(1)
  .value('标准')

selected(1) 表示默认选中第二项,索引从 0 开始。value('标准') 是按钮上直接显示的文字。

这两个最好对齐。索引选的是“标准”,按钮上却显示“完整”,用户会马上困惑。

文字样式可以分层

按钮本身的文字可以用 fontfontColor 调整。

Select([{ value: '轻量' }, { value: '标准' }, { value: '完整' }])
  .font({ size: 14, weight: 700 })
  .fontColor('#2563EB')

下拉选项也能单独设置文字样式,比如普通项和选中项可以做出一点差别。

.optionFontColor('#334155')
.selectedOptionFontColor('#2563EB')

颜色不用太多。Select 本来就是为了收纳信息,样式太花,反而会让它变成视觉中心。

箭头位置别制造意外

案例里用的是:

.arrowPosition(ArrowPosition.END)

这也是大多数人熟悉的方向:文字在前,箭头在后。除非你的页面有很强的设计理由,否则先用这个最稳。

禁用态也要说清楚

禁用 Select 很简单:

Select([{ value: '轻量' }, { value: '标准' }, { value: '完整' }])
  .enabled(false)

但页面上要告诉用户为什么点不开。比如“当前由管理员统一配置”,这句话比单纯变灰更有用。

打开案例页时,可以点开下拉看看选项样式。你项目里有没有那种选项越来越多、按钮越排越长的地方?这种地方通常就适合先收进 Select。

完整示例代码

文件位置:entry/src/main/ets/pages/arkUI/basic/ArkUISelectDemo.ets

@Entry
@Component
struct ArkUISelectDemo {
  @Builder
  sectionTitle(title: string, desc: string) {
    Column({ space: 4 }) {
      Text(title)
        .width('100%')
        .fontSize(16)
        .fontWeight(700)
        .fontColor('#0F172A')

      Text(desc)
        .width('100%')
        .fontSize(13)
        .fontColor('#64748B')
        .lineHeight(20)
    }
    .width('100%')
    .alignItems(HorizontalAlign.Start)
  }

  @Builder
  selectBlock(title: string, desc: string, selectedIndex: number, value: string, color: string, bgColor: string,
    enabled: boolean) {
    Column({ space: 10 }) {
      Text(title)
        .width('100%')
        .fontSize(15)
        .fontWeight(700)
        .fontColor(enabled ? '#0F172A' : '#94A3B8')

      Text(desc)
        .width('100%')
        .fontSize(12)
        .fontColor(enabled ? '#64748B' : '#94A3B8')
        .lineHeight(18)

      Select([{ value: '轻量' }, { value: '标准' }, { value: '完整' }])
        .selected(selectedIndex)
        .value(value)
        .font({ size: 14, weight: 700 })
        .fontColor(color)
        .optionFont({ size: 14 })
        .optionFontColor('#334155')
        .selectedOptionFont({ size: 14, weight: 700 })
        .selectedOptionFontColor(color)
        .arrowPosition(ArrowPosition.END)
        .width('100%')
        .height(42)
        .enabled(enabled)
    }
    .width('100%')
    .padding(14)
    .backgroundColor(enabled ? '#FFFFFF' : '#F1F5F9')
    .border({ width: 1, color: enabled ? bgColor : '#CBD5E1' })
    .borderRadius(8)
    .alignItems(HorizontalAlign.Start)
  }

  build() {
    Scroll() {
      Column({ space: 18 }) {
        Text('ArkUI Select')
          .width('100%')
          .fontSize(24)
          .fontWeight(700)
          .fontColor('#0F172A')

        Text('下拉一收,页面立刻清爽')
          .width('100%')
          .fontSize(22)
          .fontWeight(700)
          .fontColor('#111827')

        Text('这一页只看 Select 自己:选项数组、默认选中、按钮显示文案、选项文字样式和禁用态。不写 onSelect,也不做状态同步。')
          .width('100%')
          .fontSize(14)
          .fontColor('#64748B')
          .lineHeight(22)

        Column({ space: 12 }) {
          this.sectionTitle('选项很多时,别全摊开', '三个以上的短选项,平铺会占地方。收进 Select,页面会轻很多。')

          this.selectBlock('消息密度', '把“轻量、标准、完整”收成一个下拉选择。', 1, '标准', '#2563EB', '#BFDBFE', true)
          this.selectBlock('阅读节奏', '同样的选项,可以换一套场景文案。', 0, '轻量', '#0F766E', '#99F6E4', true)
        }
        .width('100%')
        .padding(16)
        .backgroundColor('#EFF6FF')
        .borderRadius(8)

        Column({ space: 12 }) {
          this.sectionTitle('按钮上显示的是当前判断', 'selected 是索引,value 是按钮上展示的文字。二者最好对得上,别让用户看到错位文案。')

          this.selectBlock('同步范围', '默认显示“完整”,读者一眼知道当前选择。', 2, '完整', '#7C3AED', '#DDD6FE', true)
        }
        .width('100%')
        .padding(16)
        .backgroundColor('#F5F3FF')
        .borderRadius(8)

        Column({ space: 12 }) {
          this.sectionTitle('禁用态要留出原因', '下拉点不开时,先用文案交代清楚,比只让按钮变灰更稳。')

          this.selectBlock('企业策略', '当前由管理员统一配置,暂时不能自己选择。', 1, '标准', '#64748B', '#CBD5E1', false)
        }
        .width('100%')
        .padding(16)
        .backgroundColor('#F8FAFC')
        .borderRadius(8)
      }
      .width('100%')
      .padding(20)
      .alignItems(HorizontalAlign.Start)
    }
    .width('100%')
    .height('100%')
    .backgroundColor('#FFFFFF')
  }
}
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。