iview中checkbox混合了disabled的选项时取消全选时保留disabled禁用选项

iView UI全选Checkbox组件使用详解

 

先上一段官方全选的demo代码,官方效果https://www.iviewui.com/components/checkbox

为了演示先将苹果选项disabled

<template>
    <div style="border-bottom: 1px solid #e9e9e9;padding-bottom:6px;margin-bottom:6px;">
        <Checkbox
            :indeterminate="indeterminate"
            :value="checkAll"
            @click.prevent.native="handleCheckAll">全选</Checkbox>
    </div>
    <CheckboxGroup v-model="checkAllGroup" @on-change="checkAllGroupChange">
        <Checkbox label="香蕉"></Checkbox>
        <Checkbox disabled label="苹果"></Checkbox>
        <Checkbox label="西瓜"></Checkbox>
    </CheckboxGroup>
</template>

 

<script>
    export default {
        data () {
            return {
                indeterminate: true,
                checkAll: false,
                checkAllGroup: ['苹果']
            }
        },
        methods: {
            handleCheckAll () {
                if (this.indeterminate) {
                    this.checkAll = false;
                } else {
                    this.checkAll = !this.checkAll;
                }
                this.indeterminate = false;

                if (this.checkAll) {
                    // 勾选全部按钮:这里获取全部的值 只做演示 
                    this.checkAllGroup = ['香蕉', '苹果', '西瓜'];
                } else {
                    // 取消勾选全部按钮:这里就是disabled的选项值
                    this.checkAllGroup = ['苹果'];
                }
            },
            checkAllGroupChange (data) {
                if (data.length === 3) {
                    this.indeterminate = false;
                    this.checkAll = true;
                } else if (data.length > 0) {
                    this.indeterminate = true;
                    this.checkAll = false;
                } else {
                    this.indeterminate = false;
                    this.checkAll = false;
                }
            }
        }
    }
</script>

自己工作学习记录,仅供参考。

在 **iView UI**(现名为 **View UI**)中,`CheckboxGroup` 默认会显示前面的复选框 ✔。如果你想要 **隐藏或取消前面的复选框**,只保留文本或自定义样式(如按钮风格),可以通过 **CSS 隐藏默认复选框** 来实现。 --- ### ✅ 目标效果 - ❌ 隐藏 `Checkbox` 前面的勾选框 - ✅ 保留点击功能 - ✅ 实现类似“按钮组”或“标签选择”效果 --- ### ✅ 方法:使用 CSS 隐藏 `.ivu-checkbox` ```vue <template> <div class="btn-checkbox-group"> <CheckboxGroup v-model="selectedList" @on-change="handleChange"> <Checkbox label="tech">科技型中小企业</Checkbox> <Checkbox label="high-tech">高新技术企业</Checkbox> <Checkbox label="specialized">专精特新企业</Checkbox> <Checkbox label="large-scale">规上企业</Checkbox> <Checkbox label="all">全部</Checkbox> </CheckboxGroup> </div> </template> <script> export default { data() { return { selectedList: ['all'] // 默认选中“全部” } }, methods: { handleChange(val) { // 实现“全部”与其他互斥 if (val.includes('all') && val.length > 1) { this.selectedList = ['all'] } else if (val.length === 0) { this.selectedList = ['all'] // 至少保留一个 } } } } </script> <style scoped> /* 隐藏所有 Checkbox 的勾选框 */ .btn-checkbox-group /deep/ .ivu-checkbox { display: none !important; } /* 美化 label 文字为按钮样式 */ .btn-checkbox-group /deep/ .ivu-checkbox-wrapper { margin-right: 8px; padding: 6px 12px; border: 1px solid #dcdee2; border-radius: 4px; background-color: #f8f8f9; color: #515a6e; cursor: pointer; transition: all 0.3s ease; } /* hover 效果 */ .btn-checkbox-group /deep/ .ivu-checkbox-wrapper:hover { border-color: #2d8cf0; color: #2d8cf0; } /* 选中状态样式 */ .btn-checkbox-group /deep/ .ivu-checkbox-wrapper.ivu-checkbox-wrapper-checked { background-color: #2d8cf0; border-color: #2d8cf0; color: #fff; } </style> ``` --- ### 🔍 关键点说明 | 功能 | 实现方式 | |------|----------| | **隐藏复选框** | `.ivu-checkbox { display: none }` | | **美化为按钮** | 修改 `.ivu-checkbox-wrapper` 的 padding、border、背景等 | | **控制选中状态** | 利用 `ivu-checkbox-wrapper-checked` 类名 | | **穿透样式** | 使用 `/deep/` 或 `::v-deep`(取决于构建工具) | > 💡 注意:iView 使用的是 `.ivu-checkbox-wrapper` 包裹整个选项,所以你需要改的是这个容器的样式。 --- ### ✅ 支持 Vue 3 + Vite 的写法(使用 `::v-deep`) 如果你使用的是 Vue 3 + Vite 构建项目,请将 `/deep/` 替换为: ```css ::v-deep(.ivu-checkbox) { display: none !important; } ::v-deep(.ivu-checkbox-wrapper) { /* 按钮样式 */ } ``` --- ### ✅ 添加“全部”互斥逻辑(重点) ```js handleChange(val) { if (val.includes('all') && val.length > 1) { // 如果选了“全部”,清除其他 this.$nextTick(() => { this.selectedList = ['all'] }) } else if (val.length === 0) { // 防止全不选 this.selectedList = ['all'] } } ``` > 使用 `$nextTick` 是为了确保 DOM 更新后同步状态,避免视觉延迟。 --- ### ✅ 最终效果 | 表现 | 是否支持 | |------|---------| | 隐藏前面 ✔ | ✅ | | 显示为按钮 | ✅ | | 可点击切换 | ✅ | | “全部”互斥 | ✅ | | 支持多选(非全部) | ✅ | --- ### ✅ 总结 | 需求 | 解决方案 | |------|-----------| | 隐藏复选框 | `.ivu-checkbox { display: none }` | | 自定义样式 | 改造 `.ivu-checkbox-wrapper` | | 兼容 Vue 3 | 使用 `::v-deep` 替代 `/deep/` | | 控制逻辑 | `@on-change` + 数组判断 | | 推荐封装 | 抽成组件 `<ButtonCheckboxGroup>` 更易复用 | ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值