使用element的Tree树形控件,节点选中状态下设置禁用disabled,每次选一个,且不可编辑

使用element的Tree树形控件,节点选中状态下设置禁用disabled,每次选一个,且不可编辑,效果如下图所示。
在这里插入图片描述
代码如下:

<template>
    <div class="tree3">

        <el-tree
                :data="data3"
                ref="tree"
                show-checkbox
                node-key="id"
                :check-on-click-node="checkNodeFlag"
                :default-expanded-keys="[2, 3]"

                @check-change="handleCheckChageFun"
                @check="handleCheckFun"
        >
        </el-tree>
        <!--  :default-checked-keys="defaultCheckedKeys" -->
    </div>

</template>

<script>
    export default {
        name: "TreeTest3",
        data() {
            return {
                checkNodeFlag:false,
                currNodeId:'',//当前选中nodeId
                defaultCheckedKeys:[18],
                data3: [{
                    id: 1,
                    label: '一级 2',
                    disabled:false,
                    children: [{
                        id: 3,
                        label: '二级 2-1',disabled:false
                    }, {
                        id: 2,
                        label: '二级 2-2',
                    },
                    {id: 4, label: '2级 4',disabled:false},
                    {id: 5, label: '2级 5',disabled:false},
                    {id: 6, label: '2级 6',disabled:false},
                    {id: 7, label: '2级 7',disabled:false},
                    {id: 8, label: '2级 8',disabled:false},
                    {id: 9, label: '2级 9',disabled:false},
                    {id: 10, label: '2级 10',disabled:false},
                    {id: 11, label: '2级 11',disabled:false},
                    {id: 12, label: '2级 12',disabled:false},
                    {id: 13, label: '2级 13',disabled:false},
                    {id: 14, label: '2级 14',disabled:false},
                    {id: 15, label: '2级 15',disabled:false},
                    {id: 16, label: '2级 16',disabled:false},
                    {id: 17, label: '2级 17',disabled:false},
                    {id: 18, label: '2级 18',disabled:true},

                    ]
                }],
                disableData:this.data3,
                defaultProps: {
                    children: 'children',
                    label: 'label'
                }
            };
        },
        methods:{
            handleCheckChageFun(currNode){
                console.log("hanleCheckChageFun---");
            },
            handleCheckFun(currNode){
                this.currNodeId = currNode.id;
                this.defaultCheckedKeys= null
                this.dealTreeOnceChecked(this.data3)
            },
            dealTreeOnceChecked(arrMenus){
                arrMenus === undefined ?  arrMenus=[]:''
                if(arrMenus.length > 0){
                    //let disarr = [];
                    arrMenus.forEach(item => {
                        let arrChildren = item.children
                        if(arrChildren  !== null) this.dealTreeOnceChecked(arrChildren)
                        if(item.id === this.currNodeId){
                           // disarr.push(item.id)
                            //this.defaultCheckedKeys = disarr;
                            this.$refs.tree.setCheckedKeys([item.id]);
                             item.disabled = true
                        }else{
                            item.disabled = false
                        }
                    })
                }
            }
        }
    }
</script>

<style scoped>

</style>
<style lang="stylus" >

</style>
### 实现 Element UI Tree 组件中禁用某级节点框 为了实现在特定级别的节点禁用框的功能,可以通过组合 CSS 和 JavaScript 来达到目的。以下是具体方法: #### 方法一:通过CSS隐藏并禁用指定级别节点的复框 对于希望仅在某些层级显示复框的情况,可以利用 CSS 的 `nth-child` 或者更具体的结构择器来控制不同层次节点的表现。 如果目标是在第二层及以上不展示复框,则可以在样式表中加入如下规则[^1]: ```css .my-tree .el-tree-node__children .el-tree-node__content label.el-checkbox { display: none; } ``` 此段代码会使得除了顶级节点外的所有其他子节点不再呈现复框效果。 而对于想要完全移除交互性的需求——即不仅视觉上消失而无法被点击勾,还需要进一步操作 DOM 结构中的 input 元素属性 disabled=true: ```javascript // 假设 tree 是获取到的树形控件实例对象 const nodes = document.querySelectorAll('.my-tree .el-tree-node'); nodes.forEach(node => { const level = node.getAttribute('aria-level'); // 获取当前节点所在层数 if (parseInt(level, 10) >= 2){ // 判断是否为二层以上节点 let checkboxInput = node.querySelector('input[type=checkbox]'); if(checkboxInput){ checkboxInput.setAttribute('disabled', true); // 设置该输入框为不可编辑状态 } } }); ``` 这段脚本遍历所有的 `.el-tree-node` 节点,并针对满足条件(这里是第2层及其后的所有节点)的应用逻辑处理,从而实现了对这些节点上的复框进行物理意义上的禁用。 #### 方法二:基于 Vue.js 数据绑定特性动态调整 另一种更为优雅的方式是借助于框架本身的数据驱动机制,在渲染时就决定哪些位置应该有可用的复框。这通常涉及到修改数据模型以及相应模板表达式的编写。 例如,在使用 element-ui plus 版本的情况下,可以直接配置 props 属性内的 `checkStrictly` 参数以确保父子间无联动关系;同时配合自定义 slot 插槽来自由定制每一项的内容布局,进而有条件地插入 `<el-checkbox>` 标签[^2]: ```html <template> <el-tree :data="deptOptions" show-checkbox check-strictly @check="handleCheck"> <!-- 自定义slot插槽 --> <span slot-scope="{node}"> {{ node.label }} <!-- 只当不是根节点才允许添加复--> <el-checkbox v-if="!isRootNode(node)" /> </span> </el-tree> </template> <script> export default { methods:{ isRootNode(node){ return !node.parent || node.level === 1; }, handleCheck(data,node,isChecked){} } }; </script> ``` 这种方法的好处在于它更加贴近 MVVM 思维模式,减少了直接操纵DOM带来的不确定性和维护成本。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值