vue3+ant design vue动态实现级联菜单~

1、这里使用的是ant design vue 的TreeSelect 树选择来实现的。

<a-form-item name="staffDept" label="责任部门" labelAlign="left">
  <a-tree-select
    v-model:value="formState.staffDept"
    show-search//允许在下拉框中添加搜索框
    style="width: 100%"
    :dropdown-style="{ maxHeight: '400px', overflow: 'auto' }"//设置下拉菜单的最大高度和溢出行为
    placeholder="请输入"
    allow-clear//显示清楚按钮
    tree-default-expand-all//默认展开所有树节点
    :tree-data="treeData"//将数据绑定在树形结构上
   />
</a-form-item>


import type { TreeSelectProps } from 'ant-design-vue';
import {getOrganizationChatrt} from '@/api/import';
const treeData = ref<TreeSelectProps['treeData']>([]);
const formState = ref({
    staffDept: '',
});
const handData = (array, level?) => {
    array.forEach((item, index) => {
      if (level === 0) {//获取一级菜单
        item.title = item.deptName;
        item.value = item.deptId;
      }
      if (item.nodeOfChildren != null) {//获取二级菜单
        item.children = [...item.nodeOfChildren];
        item.children.map((res) => {
          res.title = res.deptName;
          res.value = res.deptId;
        });
        handData(item.nodeOfChildren);//递归遍历,获取后续菜单如三级菜单
      }
    });
    treeData.value = array;
};
onMounted(() => {
    getOrganizationChatrt({}).then((res) => {
      console.log('测试数据', res);
      handData(res, 0);
    });
});
//假设这是后端返回的数据
[
    {
        "deptId": "00001",
        "deptName": "营销中心",
        "parentDeptId": "a00001",
        "nodeOfChildren": [
            {
                "deptId": "000011",
                "deptName": "网络管理部",
                "parentDeptId": "00001",
                "nodeOfChildren": [
                    {
                        "deptId": "0000111",
                        "deptName": "网络开发",
                        "parentDeptId": "000011",
                        "nodeOfChildren": null,
                        "title": "网络开发",
                        "value": "001"
                    },
                    {
                        "deptId": "0000112",
                        "deptName": "网络管理",
                        "parentDeptId": "000011",
                        "nodeOfChildren": null,
                        "title": "网络管理",
                        "value": "002"
                    }
                ]
            },
            {
                "deptId": "000012",
                "deptName": "市场营销部",
                "parentDeptId": "00001",
                "nodeOfChildren": null
            }
        ]
    }
]

2、效果图

抱歉,我不太理解您的问题。您是想在使用 Ant Design Vue 的情况下,如何使用 Diamante 实现动态加载二级菜单吗?如果是这样的话,您可以参考以下步骤: 1.Ant Design Vue 中使用 Cascader 组件,该组件可以实现级联选择功能。 2. 在 Cascader 组件中使用 loadData 方法,该方法可以在选择某个选项时动态加载下一级菜单的数据。 3. 在 loadData 方法中使用 Diamante 的 API,从后端获取下一级菜单的数据,并将其设置为 Cascader 组件的 options 属性。 您可以参考以下代码,其中假设您的后端 API 地址为 http://example.com/api/menu,且返回的数据格式为: ```json [ { "label": "Option 1", "value": "1", "children": [ { "label": "Sub-option 1-1", "value": "1-1" }, { "label": "Sub-option 1-2", "value": "1-2" } ] }, { "label": "Option 2", "value": "2", "children": [ { "label": "Sub-option 2-1", "value": "2-1" }, { "label": "Sub-option 2-2", "value": "2-2" } ] } ] ``` ```vue <template> <a-cascader :options="options" :load-data="loadData" @change="handleChange" /> </template> <script> import { Cascader } from &#39;ant-design-vue&#39; import axios from &#39;axios&#39; export default { components: { ACascader: Cascader, }, data() { return { options: [ { label: &#39;Option 1&#39;, value: &#39;1&#39;, isLeaf: false, }, { label: &#39;Option 2&#39;, value: &#39;2&#39;, isLeaf: false, }, ], } }, methods: { async loadData(selectedOptions) { const targetOption = selectedOptions[selectedOptions.length - 1] targetOption.loading = true const response = await axios.get(&#39;http://example.com/api/menu&#39;, { params: { parentId: targetOption.value, }, }) targetOption.loading = false const { data } = response if (data && data.length > 0) { targetOption.children = data.map((item) => ({ label: item.label, value: item.value, isLeaf: !item.children, })) } else { targetOption.isLeaf = true } }, handleChange(value, selectedOptions) { console.log(value, selectedOptions) }, }, } </script> ``` 希望这能够回答您的问题。如果您还有疑问,请随时问我。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值