查看: 113|回复: 0

鸿蒙 uni-app x checkbox 多选适配与踩坑解析

[复制链接]
发表于 1 小时前 | 显示全部楼层 |阅读模式
在鸿蒙平台上用 uni-app x 开发表单时,多选框是高频组件。鸿蒙 4.61 开始支持 checkbox-group,它需要与 checkbox 配合使用:checkbox 放在 checkbox-group 内,由 checkbox-group 监听 change 事件获取选中的 value 数组。需要注意的是,checkbox 组件的兼容性表里没有鸿蒙,但 checkbox-group 支持鸿蒙,实际项目中两者配合即可正常工作。

兼容性与属性方面,有几个关键点:checkbox 必须放在 checkbox-group 里才能正常工作,单独使用无法获取选中状态;每个 checkbox 必须设置 value,否则 change 事件返回的是空字符串;color 和 iconColor 已废弃,应改用 foreColor,否则控制台会出现警告。

基础多选写法如下:
  1. <template>
  2. <checkbox-group @change="onChange">
  3.   <checkbox value="apple">苹果</checkbox>
  4.   <checkbox value="banana">香蕉</checkbox>
  5.   <checkbox value="orange">橙子</checkbox>
  6. </checkbox-group>
  7. <text>选中:{{selected}}</text>
  8. </template>
  9. <script setup lang="uts">
  10. const selected = ref('')
  11. const onChange = (event: UniCheckboxGroupChangeEvent) => {
  12.   selected.value = event.detail.value.join(', ')
  13. }
  14. </script>
复制代码

默认选中通过 checked 属性实现,禁用通过 disabled 属性实现。注意 checked 只是初始状态,用户点击后选中状态由组件内部管理,不能通过动态修改 checked 来控制。
  1. <checkbox-group>
  2.   <checkbox value="agree" checked>同意用户协议</checkbox>
  3.   <checkbox value="newsletter">订阅邮件通知</checkbox>
  4.   <checkbox value="option3" disabled>禁用项</checkbox>
  5.   <checkbox value="option4" disabled checked>禁用且选中</checkbox>
  6. </checkbox-group>
复制代码

自定义样式可设置 foreColor、backgroundColor、borderColor、activeBackgroundColor、activeBorderColor 等属性。鸿蒙平台 checkbox 的默认样式可能与其他平台略有差异,建议通过这些属性统一自定义。
  1. <checkbox value="custom1"
  2.   foreColor="#9C27B0"
  3.   backgroundColor="#F3E5F5"
  4.   borderColor="#CE93D8"
  5.   activeBackgroundColor="#E1BEE7"
  6.   activeBorderColor="#9C27B0"
  7.   checked>紫色主题</checkbox>
复制代码

列表多选是常见场景,用 v-for 渲染数据源,并给 checkbox 绑定 value 和 checked。
  1. <checkbox-group @change="onHobbyChange">
  2.   <view v-for="(item, index) in hobbies" :key="index">
  3.     <checkbox :value="item.value" :checked="item.checked"></checkbox>
  4.     <text>{{item.name}}</text>
  5.   </view>
  6. </checkbox-group>
  7. <script setup lang="uts">
  8. type Hobby = {
  9.   name: string
  10.   value: string
  11.   checked: boolean
  12. }
  13. const hobbies = ref([
  14.   { name: '阅读', value: 'reading', checked: false },
  15.   { name: '运动', value: 'sports', checked: true },
  16.   { name: '音乐', value: 'music', checked: false }
  17. ] as Array<Hobby>)
  18. const selectedHobbies = ref('')
  19. const onHobbyChange = (event: UniCheckboxGroupChangeEvent) => {
  20.   selectedHobbies.value = event.detail.value.join(', ')
  21. }
  22. </script>
复制代码

表单提交场景中,给 checkbox-group 设置 name,配合 form 的 submit 事件获取表单数据。
  1. <form @submit="onSubmit">
  2.   <checkbox-group name="services">
  3.     <checkbox value="delivery">送货上门</checkbox>
  4.     <checkbox value="install">安装服务</checkbox>
  5.     <checkbox value="warranty">延长保修</checkbox>
  6.   </checkbox-group>
  7.   <button form-type="submit" type="primary">提交</button>
  8. </form>
  9. <script setup lang="uts">
  10. const onSubmit = (event: UniFormSubmitEvent) => {
  11.   console.log('表单数据:', event.detail.value)
  12. }
  13. </script>
复制代码

全选、反选和清空需要修改数据源的 checked 属性,然后通过 v-for 重新渲染,不能直接操作 DOM。change 事件只在用户点击时触发。
  1. <button @click="selectAll">全选</button>
  2. <button @click="invertSelect">反选</button>
  3. <button @click="clearAll">清空</button>
  4. <checkbox-group @change="onChange">
  5.   <view v-for="(item, index) in items" :key="index">
  6.     <checkbox :value="item.value" :checked="item.checked"></checkbox>
  7.     <text>{{item.name}}</text>
  8.   </view>
  9. </checkbox-group>
  10. <script setup lang="uts">
  11. const items = ref([
  12.   { name: '选项 A', value: 'a', checked: false },
  13.   { name: '选项 B', value: 'b', checked: false },
  14.   { name: '选项 C', value: 'c', checked: false }
  15. ])
  16. const selectAll = () => {
  17.   items.value.forEach(item => { item.checked = true })
  18. }
  19. const invertSelect = () => {
  20.   items.value.forEach(item => { item.checked = !item.checked })
  21. }
  22. const clearAll = () => {
  23.   items.value.forEach(item => { item.checked = false })
  24. }
  25. const selectedCount = ref(0)
  26. const onChange = (event: UniCheckboxGroupChangeEvent) => {
  27.   selectedCount.value = event.detail.value.length
  28. }
  29. </script>
复制代码

与鸿蒙原生开发对比,鸿蒙原生多选使用 Checkbox 组件,写法如下:
  1. Checkbox({ name: 'apple', group: 'fruits' })
  2.   .select(true)
  3.   .selectedColor('#2196F3')
  4.   .onChange((value: boolean) => {
  5.     console.log('选中状态:', value)
  6.   })
复制代码

对比下来,uni-app x 的 checkbox 用属性控制样式,跟 checkbox-group 配合获取选中值,写法更统一。

踩坑记录汇总:checkbox 必须放在 checkbox-group 里;value 必须设置;color 和 iconColor 已废弃,使用 foreColor;checked 只是初始状态;全选/反选需要修改数据源;checkbox-group 的 change 事件只在用户点击时触发。在鸿蒙平台适配时,重点关注这些差异,可以避免大部分常见问题。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-9-20 13:09 , Processed in 0.029815 second(s), 19 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部