二次封装element-ui的el-tree组件

个人二次封装的tree组件,有不对的地方,可以在评论区指出我的问题!

此组件支持单选,限制勾选数量及不限制数量多选,勾选达到限制数量的情况下,其他复选框自动变成禁用状态,在取消选择第 限制数量  框时复选框禁用状态恢复可用,且文字点击和复选框的点击不会冲突

组件源码如下

<template>
    <div>
        <el-tree
            ref="tree"
            v-on="$listeners"
            v-bind="$attrs"
            @node-click="nodeClick"
            @check="checkClick"
            :default-expanded-keys="expandedKey"
            :default-checked-keys="checkedKey"
        />
    </div>
</template>
<script>
export default {
    name:'TreeSelect',
    props:{
        expandedKey:{
            type:Array,
            default:()=>[]
        },
        checkedKey:{
            type:Array,
            default:()=>[]
        },
        maxSelect:{
            type:Number,
            default:()=>0
        },
    },
    data(){
        return{
            isNodeClick:false,
        }
    },
    methods:{
        checkClick(data, treeInfo){
            if(this.isNodeClick){
                this.isNodeClick=false
                return
            }
            if(this.maxSelect==0){//不限制可选数量
                this.$emit('input',this.$refs.tree.getCheckedKeys())//回数组
            }else{//限制可选数量
                if(this.maxSelect==1){
                    if (treeInfo.checkedKeys.length) {
                        //单选实现
                        this.$refs.tree.setCheckedKeys([data.id]);
                        this.$emit('input',this.$refs.tree.getNode(data.id).data.id)//回id
                    } else {
                        //取消当前选中节点
                        this.$refs.tree.setCheckedKeys([]);
                        this.$emit('input','')
                    }
                }
                else    this.check(data)
            }
            this.$emit("getNode",this.$refs.tree.getNode(data.id))
        },
        nodeClick(data, treeInfo){
            if(treeInfo.childNodes.length!=0)   return
            if(this.$refs.tree.lazy)    return//懒加载情况下不适用node点击勾选复选框情况
            this.isNodeClick=true
            if(this.maxSelect==0){//不限制可选数量
                this.$emit('input',this.$refs.tree.getCheckedKeys())//回数组
            }else{//限制可选数量
                if(treeInfo.data.disabled)  return
                if(this.maxSelect==1){//单选
                    if (treeInfo.checked) {
                        this.$refs.tree.setCheckedKeys([data.id]);
                        this.$emit('input',this.$refs.tree.getNode(data.id).data.id)//回id
                    } else {
                        this.$refs.tree.setCheckedKeys([]);
                        this.$emit('input','')
                    }
                }
                else    this.check(data)
            }
        },
        check(data){
            let treeNodesMap = this.$refs.tree.store?.nodesMap || {};
            let status = this.maxSelect==this.$refs.tree.getCheckedKeys().length

            if (status) {
                // this.$message.error(`最多可选择${this.maxSelect}个`)
                Object.keys(treeNodesMap).forEach(key => {
                    let item = treeNodesMap[key] || {};
                    if (!this.$refs.tree.getCheckedKeys().includes(parseInt(key))) {
                        let data = item.data || {};
                        data.disabled = status;
                        //设置其他的展开点击为不可选取
                        this.$refs.tree.setCurrentNode(data);
                    }
                })
            }
            else{
                this.options.forEach(item=>{
                    item.disabled=true
                    item.children.forEach(item1=>{
                        item1.disabled=false
                    })
                })
            }
            this.$emit('input',this.$refs.tree.getCheckedKeys())//回id
        }
    },
}
</script>
<style lang="less" scoped>
.custom-tree-node {
    flex: 1;
    display: flex;
    align-items: center;
    justify-content: space-between;
    font-size: 14px;
    padding-right: 8px;
  }

</style>

 父组件源码如下:

                    <TreeSelect
                        :options="depData"
                        node-key="id"
                        show-checkbox
                        highlight-current
                        check-on-click-node
                        check-strictly
                        :expandedKey="[addParams.depId]"
                        :checkedKey="[addParams.depId]"
                        :maxSelect="1"
                        @input="input"
                    />
        input(val){
            this.addParams.depId = val
        },

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值