2021.11.14 D20—自学vue,select下添加checkbox

本文介绍了如何在Element-UI的下拉选择框el-select中添加复选框实现多选功能。通过在每个option前面插入一个el-checkbox,并结合Vue的v-model和事件监听,实现了全选和单选的同步。同时,利用nextTick确保DOM更新后进行操作,确保了选中状态的正确显示。
摘要由CSDN通过智能技术生成

开发过程中总会遇到一些奇奇怪怪的设计,比如以下这个。

说明:使用element-ui框架,

它有以下组件:el-checkbox与el-select

目标:在el-select的option前面添加checkbox,达到下拉并能多选的目的

具体实现:

<el-select v-model="submitForm.role" collapse-tags clearable multiple @change="changeSelect" @visible-change="visibleSelect">
    <el-checkbox v-model="checkAll" @change="handleCheckAllChange" style="padding:0.3vw 0.52vw;width:100%">全部</el-checkbox>
    <el-option v-for="item in roleOptions" :label="item.name" :key="item.id" :value="item.id"></option>
</el-select>
data () {
    charOptions: [
        { id: 1, name: '角色A'},
        { id: 2, name: '角色B'},
        { id: 3, name: '角色C'},
        { id: 4, name: '角色DEFGHIJKLMN'}
    ],
    checkAll: true, // 全选
    roleOptions: [], // 角色选项列表
    submitForm: {
        role: '全部'
    }
}

 方法:

/** 全选 */
handleCheckAllChange () {
    this.submitForm.role = []
    if (this.checkAll) {
        this.roleOptions.map(item => {
            this.submitForm.role.push(item.id)
        })
        const lis = document.getElementsByClassName('el-select-dropdown__item')
        for (let i = 0; i < lis.length; i++) {
            const element = lis[i]
            // 必须使用nextTick 否则拿不到最新的修改后的dom选中状态,也就没法判断
            this.$nextTick(() => {
                element.firstChild.checked = true
            })
        }
    } else {
        this.submitForm.role = []
        const lis = document.getElementsByClassName('el-select-dropdown__item')
        for (let i = 0; i < lis.length; i++) {
            const element = lis[i]
            // 必须使用nextTick 否则拿不到最新的修改后的dom选中状态,也就没法判断
            this.$nextTick(() => {
                element.firstChild.checked = false
            })
        }
    }
}
/** 下拉框展开 关闭事件 */
visibleSelect (e) {
    // 获取所有的li
    const lis = document.getElementsByClassName('el-select-dropdown__item')
    // 打开所有的下拉框,添加input
    if (e) {
        for (let i = 0; i < lis.length; i++) {
            const element = lis[i]
            const input = document.createElement('input')
            input.style.cssText = 'margin-right: 0.52vw'
            input.type = 'checkbox'
            // 根据是否有选中的类名来判断li是否被选中
            if (element.classList.contains('selected')) {
                // 对应复选框也设置被选中
                input.checked = true
            }
            element.insertBefore(input, element.lastChild)
        }
    } else {
        // 关闭下拉框 移除掉input -- 否则每次打开添加就是多个input
        for (let i = 0; i< lis.length; i++) {
            const element = lis[i]
            element.removeChild(element.firstElementChild)
        }
    }
}
/** 下拉选项变换事件 */
changeSelect (val) {
    if (val.length === this.roleOptions.length) {
        this.checkAll = true
    } else {
        this.checkAll = false
    }
    const lis = document.getElementsByClassName('el-select-dropdown__item')
    for (let i = 0; i < lis.length; i++) {
        const element = lis[i]
        // 必须使用nextTick 否则拿不到最新的修改后的dom选中状态 也就没法判断
        this.$nextTick(() => {
            // 判断当前的li是否被选中,选中的则设置复选框被选中
            if (element.classList.contains('selected')) {
                element.firstChild.checked = true
            } else {
                element.firstChild.checked = false
            }
        })
    }
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值