a-tree 实现父级节点禁用,通过子级节点勾选状态控制

这篇具有很好参考价值的文章主要介绍了a-tree 实现父级节点禁用,通过子级节点勾选状态控制。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

a-tree 组件实现折叠选择;使其父级节点禁用,通过子级节点的勾选状态来控制是否勾选;如果子级节点勾选任一个,父级节点就勾选中,如果子级节点全部不勾选则父节点不勾选,否则勾选 ,效果如下:

a-tree 实现父级节点禁用,通过子级节点勾选状态控制,AntDesignVue 和 vxe-table,vue.js,html,前端

代码实现如下所示:

1、封装组件 setTableToolbar

vue 部分

<template>
    <div class="toolbar-meta">  
        <vxe-pulldown  ref="vxePulldown" transfer @hide-panel="hidePanel">
            <template #default>
                <a-button  shape="circle" @click="open()" :size="16">
                    <vxe-icon style="font-size: 20px;" name="setting"></vxe-icon> 
                </a-button>
            </template> 
            <template  #dropdown> 
                <div class="downBox" >
                    <!-- <div class="checkTopAll"> 
                        <a-checkbox 
                        v-model="checkAll"  
                        @change="onCheckAllChange"
                        >全部
                        </a-checkbox>
                    </div> -->
                    <div class="checkItem"> 
                        <a-tree  
                            v-if="plainOptions.length>0"
                            checkable
                            :checkStrictly="true"
                            :tree-data="plainOptions"  
                            :expandedKeys="expandedKeys"
                            :checkedKeys="checkedList"
                            :replace-fields="{children: 'children', title: 'title', key: 'id'}"
                            @expand="onExpand" 
                            @check="checkNode"
                        />
                    </div>
                     <!-- 底部按钮 -->
                     <div  class="downBtn clearfix">
                        <a-button class="btnOk" @click="sumbitOk">确认</a-button>
                        <a-button class="btnReset" @click="sumbitReset">全选</a-button>
                     </div>
                </div> 
            </template>
        </vxe-pulldown> 
    </div>
</template>

 js部分代码设置:

export default {
    name: 'setTableToolbar',
    components: { 
    },
    props: { 
        columns: {
            type: Array, 
            default: [],
        }
    },
    data(){
        return { 
            expandParent: true,
            expandedKeys: [],
            indeterminate: true,
            userInfo: {},
            checkAll: false,
            checkedList: [],
            plainOptions: [],
            Downtype: false
        }
    }, 
    watch: {
        checkedList() { // 监听设置
            this.isCheckedAll()
        },
    },
    methods:{
        open(){
            this.$refs.vxePulldown.togglePanel() 
            if(this.Downtype){
                this.sumbitOk()
                // this.$refs.vxePulldown.hidePanel() 
            } else {
                this.Downtype = !this.Downtype
            } 
        },
        // 隐藏 执行保存
        hidePanel(){
            this.sumbitOk()
        },
        // 父级节点展开、收缩事件
        onExpand(select, e){
            let val = e.node.eventKey || '' 
            if(this.expandedKeys.indexOf(val) > -1) { 
                this.expandedKeys.splice(this.expandedKeys.indexOf(val), 1) 
            } else {
                this.expandedKeys.push(val) 
            } 
        }, 
        // 
        /**
         * 初始设置
         * @param {*} arr  所有选择项
         * @param {*} selearr  已选择项
         * @param {*} info  用户信息 保存使用
         */
        resetListLable(arr, selearr, info){
            this.userInfo = info || {}
            let plainOptions = []
            arr.forEach((item, i) => {
                if(item.title&&item.dataIndex&&item.dataIndex != 'action'){
                    item.id = item.dataIndex 
                    item.key = '0-'+i
                    if(item.children && item.children.length>0){
                        item.disabled = true
                        item.children.forEach((itm,u)=>{
                            itm.id = itm.dataIndex ? itm.dataIndex : 'p-'+i +'-'+u
                            itm.key = '0-'+i +'-'+u
                            if(itm.children&&itm.children.length>0){
                                itm.disabled = true
                                itm.children.forEach((imt,ui)=>{
                                    imt.id= imt.dataIndex ? imt.dataIndex : 'p-'+i +'-'+u+'-'+ui
                                    imt.key = '0-'+i +'-'+u+'-'+ui
                                })
                            }
                        })
                    } 
                    plainOptions.push(item) 
                } 
            });
            this.plainOptions = plainOptions 
            let seletOption = [] 
            if(selearr){
                selearr.forEach(itm => {
                    if(itm.title&&itm.dataIndex&&itm.dataIndex != 'action'){  
                        let objItem = itm.dataIndex
                        seletOption.push(objItem)
                        if(itm.children&&itm.children.length>0){
                            itm.children.forEach(itm2=>{
                                seletOption.push(itm2.dataIndex)
                                if(itm2.children&&itm2.children.length>0){
                                    itm2.children.forEach(itm3=>{
                                        seletOption.push(itm3.dataIndex) 
                                    })
                                }
                            })
                        }
                    } 
                }); 
            }
           this.checkedList = seletOption
        },
        //选择点击 
        checkNode(check, e){
            this.checkedList =  e.checkedNodes &&  e.checkedNodes.length>0 ? e.checkedNodes.map(x=>{return x.key}) : []  
           this.parentCheckNode(check, e)
        },
        // 判断是否选择父节点
        parentCheckNode(check, e){ 
           this.plainOptions.forEach((item,u)=>{
                if(this.checkedList.indexOf(item.id) > -1) {
                    let isHaveParent = true
                    // 查子节点内是否
                    if(e.checked == false && item.children && item.children.length>0){ 
                        item.children.forEach((itm,b)=>{
                            if(this.checkedList.indexOf(itm.id) > -1) { 
                                let isPHaveParent = true
                                if(e.checked == false && itm.children && itm.children.length>0){
                                    itm.children.forEach(itm2=>{
                                        if(this.checkedList.indexOf(itm2.id) > -1) {
                                            isPHaveParent = false
                                            return
                                        }
                                    })
                                    if(isPHaveParent == true){
                                        this.checkedList.splice(this.checkedList.indexOf(itm.id), 1)  
                                        return
                                    } 
                                } else {
                                    isHaveParent = false 
                                    return
                                } 
                            }  
                        })
                        if(isHaveParent == true){
                            this.checkedList.splice(this.checkedList.indexOf(item.id), 1)  
                            return
                        }
                    } else {
                        return
                    } 
                    return
                } else { 
                   if(item.children && item.children.length>0){
                        item.children.forEach((itm,b)=>{
                            if(this.checkedList.indexOf(itm.id) > -1) { 
                                this.checkedList.push(item.id)
                                return
                            } else { 
                                if(itm.children&&itm.children.length>0){
                                    itm.children.forEach((imt,ui)=>{
                                        if(this.checkedList.indexOf(imt.id) > -1) { 
                                            this.checkedList.push(item.id)
                                            this.checkedList.push(imt.id)
                                            return
                                        }   
                                    })
                                }
                            }
                          
                        })
                    }
                } 
           })
        },
         // 查看点击事件
        selectNode(selectkey, e){  
            let node_eventKey = e.node.eventKey || ''  
            this.param = { 
                id: node_eventKey,
                title: e.node.title || '',
            }
            this.selectKeys = [node_eventKey]  
        }, 
        // 全选设置
        onCheckAllChange(e){ 
            let newList = []
            if(e.target.checked){
                this.plainOptions.forEach(item =>{
                    newList.push(item.dataIndex)
                })
            } 
            this.checkedList = newList  
            this.isCheckedAll()
        },
        // 判断是否全选
        isCheckedAll(){
            let isAll = false
            isAll = this.checkedList.length == this.plainOptions.length ? true : false
            this.indeterminate = isAll
            this.checkAll = isAll
        },
        // 确认选中
        sumbitOk(){
            let extend = this.checkedList.join(',') 
            this.$emit('isSettingColumnsOk', this.checkedList)
            this.$refs.vxePulldown.hidePanel() 
            this.Downtype = false
        },
        // 还原全选
        sumbitReset(){
            this.checkAll = true
            let newList = []
            this.plainOptions.forEach(item =>{
                newList.push(item.dataIndex)
                if(item.children && item.children.length>0){
                    item.children.forEach((itm,u)=>{
                        newList.push(itm.dataIndex)
                        if(itm.children&&itm.children.length>0){
                            itm.children.forEach((imt,ui)=>{
                                newList.push(imt.dataIndex)
                            })
                        }
                    })
                }
            })
            this.checkedList = newList
            let extend = this.checkedList.join(',')
            this.$nextTick(() => { 
                this.$emit('isSettingColumnsOk', this.checkedList)
                this.$refs.vxePulldown.hidePanel() 
                this.Downtype = false
            })
        }, 
    }
}

style 样式部分修改;

.toolbar-meta{
    position: relative; 
}
.downBox{
        width: 220px;
        position: relative;
        overflow: hidden;
        border: 1px solid #999;
        border-radius: 4px;
        .checkTopAll{
            position: absolute; 
            top: 0;
            left: 0;
            border-bottom: 1px solid #999;
            padding: 10px 5px;
            width:100%;
            background-color: #fff; 
            z-index: 999;
        }
        .checkItem{
            position: relative;
            width: 220px; 
            max-height:200px; 
            overflow:auto; 
            padding: 10px;
            margin-bottom: 40px;
            .checkLi{
                display: block;
                width: 100%;
            }
            .ant-checkbox-group-item{
                display: block;
            }
        }
        .downBtn{
            position: absolute;
            z-index: 999;
            bottom: 0;
            left: 0;
            width: 100%;
            padding: 5px 10px; 
            background: #fff;
            border-top:1px solid #999;
            .btnReset{
                float: right;
            }
        }
    }

2、引用组件:setTableToolbar

<set-table-toolbar ref="setTableToolbar1" :columns="defColumns" @isSettingColumnsOk="isSettingColumnsOk" @reshload="reshColumns"></set-table-toolbar>

<script>
// 列配置
import setTableToolbar from "./common/setTableToolbar.vue"
export default {
    components: {
        setTableToolbar 
    },
    data() {
        return {
            tableColumnsParams:{},
            settingColumns: [],
            defColumns: []
        }
    },
    methods:{
        // 配置列点击确认
     isSettingColumnsOk(settingColumnsStr){ 
       if (settingColumnsStr&&settingColumnsStr.length>0) {
        this.settingColumns = settingColumnsStr
        let params = {
          'id': this.tableColumnsParams.id || '',
          'tableId': this.tableColumnsParams.cgformHeadId || this.code,
          'conntent': settingColumnsStr.join(',')
        }
       Vue.ls.set('保存缓存名字', settingColumnsStr.join(','))
        // this.saveColumnsHiding(params)
      } 
    },
    // 配置列后获取
    reshColumns(){  
        this.$nextTick(() => { 
            this.loadData(1)
        })
    },
    }
}
</script>

补充,其他设置:初始执行设置被选项,已选项等;

 this.$refs.setTableToolbar.resetListLable(this.defColumns, cols, info)

以上内容仅供参考,具体请根据实际情况选用;文章来源地址https://www.toymoban.com/news/detail-601573.html

到了这里,关于a-tree 实现父级节点禁用,通过子级节点勾选状态控制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • element UI中实现tree树形控件部分选中时父级节点也被选中

    最近有一个很奇葩的需求,在使用element UI中的tree树形控件选中功能时,子节点部分选中时父级节点也要被选中,并且回显也要保留部分子节点选中父节点半选中状态。 按照平时正常逻辑来处理,提交时只需要获取选中项的父级节点一并提交即可,这样正常提交是没有任何问

    2024年02月08日
    浏览(57)
  • ElementUi tree树叶子节点显示复选框且限制勾选

    业务需求: 只有子节点有复选框 tree树 最多选 5个 ,其余的显示为 禁用状态 如图所示: 查看解析后的树结构代码我们知道,只有 叶子节点 有单独的 class 标识 is-leaf ,如果是单独操作 叶子节点 则可以从这个标识下手; 隐藏根节点,展示叶子节点 使用递归处理tree树数据

    2024年02月12日
    浏览(115)
  • VUE--插槽slot(将父级的模块片段插入到子级中)

    组件可以接收任意类型的JS值作为props,但我们想要为子组件传递一些模板片段,并在子组件中进行渲染时,此时可以采用插槽slot来实现 简单来说,插槽时组件内留一个或多个插槽的位置,供组件传递对应的模板代码(传递任意HTML的结构),插槽的存在使得组件变的更为灵活

    2024年01月22日
    浏览(43)
  • 解决element ui中的el-tree组件default-checked-keys默认勾选节点问题

    选中子节点的时候,父节点必须被选中,但是仅展示被选中父节点和子节点 方法1 html部分代码: 当需要动态改变树形结构的默认勾选值(例如每条数据都需要调接口查询,根据查询结果渲染树的选中情况)时,只修改defaultChecked的时,值的改变没有渲染相应的树节点,需要通

    2024年04月25日
    浏览(47)
  • 【Labview-3D虚拟平台】Labview与Solidworks联合仿真(保姆级)(下)在Labview中使用Solidworks的3D模型——装配体、父级与子级

    🎉欢迎来到Labview专栏~Labview-3D虚拟平台(下) ☆* o(≧▽≦)o *☆ 嗨 ~我是 小夏与酒 🍹 ✨ 博客主页: 小夏与酒的博客 🎈该系列 文章专栏: Labview-3D虚拟平台 文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏 📜 欢迎大家关注! ❤️ 实现效果: 经典案例展示

    2024年02月22日
    浏览(47)
  • element-ui el-table表格勾选框条件禁用,及全勾选按钮禁用, 记录

    表格的部分内容是可以被勾选的,部分内容是不可以被勾选的 使用的是 “element-plus”: “^2.2.22”, 以上应该都是兼容的 要求el-table表格中,部分内容不可以被勾选,全选框在没有可选内容时,是禁用状态 如上图所示,要求数据id是1或者2的数据不可被选择,当数据只剩下id为

    2024年01月22日
    浏览(55)
  • layui tree组件取消勾选

    layui(2.8.15) tree的api中,只有 tree.setChecked(id, idArr) 方法,没有取消勾选的方法。 我的需求是:勾选后做判断,如果不符合条件则取消勾选。 实现方法: 使用 tree的oncheck事件,在回调函数中做判断,并确定是否取消勾选: 即使用 obj.elem.find(\\\'.layui-form-checked\\\').removeClass(\\\'layui-

    2024年02月11日
    浏览(49)
  • el-tree 实现节点高亮

    要实现显示  el-tree  节点高亮,可以使用  el-tree  提供的  highlight-current  属性和  current-node-key  属性,以及  el-tree-node  组件提供的  highlight  属性。 首先,在  el-tree  组件中设置  highlight-current  属性为  true ,表示启用高亮当前节点的功能: 然后,在  el-tree  组件中

    2024年02月08日
    浏览(52)
  • LayUi 树形组件tree 实现懒加载模式,展开父节点时异步加载子节点数据

    如题。 效果图:   //lazy属性为true,点开时才加载   引用代码: tree-define.js文件: 重写的tree.js: 扩展这个tree.js的原作者链接:https://www.cnblogs.com/han1982/p/11535627.html#!comments 【HG-Layui-UI通用后台管理框架V1.0版】 下载地址: https://www.cnblogs.com/han1982/p/12003454.html

    2024年02月15日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包