在鸿蒙平台上用 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,否则控制台会出现警告。
基础多选写法如下:
- <template>
- <checkbox-group @change="onChange">
- <checkbox value="apple">苹果</checkbox>
- <checkbox value="banana">香蕉</checkbox>
- <checkbox value="orange">橙子</checkbox>
- </checkbox-group>
- <text>选中:{{selected}}</text>
- </template>
- <script setup lang="uts">
- const selected = ref('')
- const onChange = (event: UniCheckboxGroupChangeEvent) => {
- selected.value = event.detail.value.join(', ')
- }
- </script>
复制代码
默认选中通过 checked 属性实现,禁用通过 disabled 属性实现。注意 checked 只是初始状态,用户点击后选中状态由组件内部管理,不能通过动态修改 checked 来控制。
- <checkbox-group>
- <checkbox value="agree" checked>同意用户协议</checkbox>
- <checkbox value="newsletter">订阅邮件通知</checkbox>
- <checkbox value="option3" disabled>禁用项</checkbox>
- <checkbox value="option4" disabled checked>禁用且选中</checkbox>
- </checkbox-group>
复制代码
自定义样式可设置 foreColor、backgroundColor、borderColor、activeBackgroundColor、activeBorderColor 等属性。鸿蒙平台 checkbox 的默认样式可能与其他平台略有差异,建议通过这些属性统一自定义。
- <checkbox value="custom1"
- foreColor="#9C27B0"
- backgroundColor="#F3E5F5"
- borderColor="#CE93D8"
- activeBackgroundColor="#E1BEE7"
- activeBorderColor="#9C27B0"
- checked>紫色主题</checkbox>
复制代码
列表多选是常见场景,用 v-for 渲染数据源,并给 checkbox 绑定 value 和 checked。
- <checkbox-group @change="onHobbyChange">
- <view v-for="(item, index) in hobbies" :key="index">
- <checkbox :value="item.value" :checked="item.checked"></checkbox>
- <text>{{item.name}}</text>
- </view>
- </checkbox-group>
- <script setup lang="uts">
- type Hobby = {
- name: string
- value: string
- checked: boolean
- }
- const hobbies = ref([
- { name: '阅读', value: 'reading', checked: false },
- { name: '运动', value: 'sports', checked: true },
- { name: '音乐', value: 'music', checked: false }
- ] as Array<Hobby>)
- const selectedHobbies = ref('')
- const onHobbyChange = (event: UniCheckboxGroupChangeEvent) => {
- selectedHobbies.value = event.detail.value.join(', ')
- }
- </script>
复制代码
表单提交场景中,给 checkbox-group 设置 name,配合 form 的 submit 事件获取表单数据。
- <form @submit="onSubmit">
- <checkbox-group name="services">
- <checkbox value="delivery">送货上门</checkbox>
- <checkbox value="install">安装服务</checkbox>
- <checkbox value="warranty">延长保修</checkbox>
- </checkbox-group>
- <button form-type="submit" type="primary">提交</button>
- </form>
- <script setup lang="uts">
- const onSubmit = (event: UniFormSubmitEvent) => {
- console.log('表单数据:', event.detail.value)
- }
- </script>
复制代码
全选、反选和清空需要修改数据源的 checked 属性,然后通过 v-for 重新渲染,不能直接操作 DOM。change 事件只在用户点击时触发。
- <button @click="selectAll">全选</button>
- <button @click="invertSelect">反选</button>
- <button @click="clearAll">清空</button>
- <checkbox-group @change="onChange">
- <view v-for="(item, index) in items" :key="index">
- <checkbox :value="item.value" :checked="item.checked"></checkbox>
- <text>{{item.name}}</text>
- </view>
- </checkbox-group>
- <script setup lang="uts">
- const items = ref([
- { name: '选项 A', value: 'a', checked: false },
- { name: '选项 B', value: 'b', checked: false },
- { name: '选项 C', value: 'c', checked: false }
- ])
- const selectAll = () => {
- items.value.forEach(item => { item.checked = true })
- }
- const invertSelect = () => {
- items.value.forEach(item => { item.checked = !item.checked })
- }
- const clearAll = () => {
- items.value.forEach(item => { item.checked = false })
- }
- const selectedCount = ref(0)
- const onChange = (event: UniCheckboxGroupChangeEvent) => {
- selectedCount.value = event.detail.value.length
- }
- </script>
复制代码
与鸿蒙原生开发对比,鸿蒙原生多选使用 Checkbox 组件,写法如下:
- Checkbox({ name: 'apple', group: 'fruits' })
- .select(true)
- .selectedColor('#2196F3')
- .onChange((value: boolean) => {
- console.log('选中状态:', value)
- })
复制代码
对比下来,uni-app x 的 checkbox 用属性控制样式,跟 checkbox-group 配合获取选中值,写法更统一。
踩坑记录汇总:checkbox 必须放在 checkbox-group 里;value 必须设置;color 和 iconColor 已废弃,使用 foreColor;checked 只是初始状态;全选/反选需要修改数据源;checkbox-group 的 change 事件只在用户点击时触发。在鸿蒙平台适配时,重点关注这些差异,可以避免大部分常见问题。 |