使用a-directory-tree实现目录多选

文章描述了一个Vue应用中的<a-directory-tree>组件的使用,涉及v-model绑定、属性设置如dropdown-style、checkable等。主要功能包括获取目录数据、处理节点点击事件以加载子目录、实现节点禁用和选中逻辑。代码中定义了处理函数如getServiceLayerDataEvt、onCheckEvt,用于动态更新目录树并控制节点的选中状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<a-directory-tree
    v-model:checkedKeys="selectedKeysVal"
    style="width: 100%"
    :dropdown-style="{
        maxHeight: '400px',
        overflow: 'auto',
    }"
    checkable
    :tree-data="serverLayerSelect"
    :field-names="fieldNames"
    @click="getServiceLayerDataEvt"
    @select="onCheckEvt"
></a-directory-tree>
const fieldNames: any = {
    children: 'children',
    title: 'name',
};
const selectedKeysVal: any = ref([]);// 选中选项的数组
//获取最初目录
const serverLayerSelect: Ref<Array<any>> = ref([]);
// 显示目录时调用该函数
const addMapLayerEvt = () => {
    serverLayerSelect.value = [];
    getSelectCatalogTrees().then((res: any) => {
        if (res.code == 200) {
            serverLayerSelect.value = res.data.map((it: any) => {
                it.disableCheckbox = true;
                return it;
            });
        }
    });
};
// 点击目录获取子目录
const getServiceLayerDataEvt = (checkedKeys: any,e: any) => {
    if (e.children.length == 0) {
        getCatalogLists({ id: e.id }).then((res: any) => {
            if (res.code == 200) {
                let list = res.data.map((it: any) => {
                    it.children = it.list;
                    it.disableCheckbox = true;
                    return it;
                });
                e.children = list.map((item: any) => {
                    item.disableCheckbox = true;
                    return item;
                });
                searchTree(serverLayerSelect.value, e.id, list);
            }
        });
    }
}
function searchTree(nodes: any, id: string, list: any) {
    for (let _i = 0; _i < nodes.length; _i++) {
        if (nodes[_i].id === id) {
            nodes[_i].children = list.map((it) => {
                it.disableCheckbox = true;
                return it;
            });
        } else {
            if (nodes[_i].children && nodes[_i].children.length > 0) {
                searchTree(nodes[_i].children, id, list);
            }
        }
    }
}
// 勾选显示
const onCheckEvt = (checkedKeys: string[], e: any) => {
    dealData(e.node);
};
const dealData = (data: any) => {
    if (data.children) {
        for (let i = 0; i < data.children.length; i++) {
            const data1 = data.children[i];
            if (data1) {
                dealData(data1);
            }
        }
    } else {
        // 不需要显示勾选的项
        if (data.id == '1574318899918864385') {
            selectedKeysVal.value = [];
            return;
        }
        if (data.id == '1582940878267809794') {
            return;
        }
        if (!selectedKeysVal.value.includes(data.key)) {
            selectedKeysVal.value.push(data.key);
        } else {
            selectedKeysVal.value.splice(
                selectedKeysVal.value.indexOf(data.key),
                1,
            );
        }
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小满blue

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值