vant树型菜单多级_树形多级菜单数据源嵌套结构与扁平结构互转

本文介绍了如何处理后端返回的扁平化数据源,将其转换为适合前端渲染的嵌套结构,以及如何将嵌套结构转换回扁平结构。提供了两个转换函数:`FlatToNested`和`NestedToFlat`,并给出了详细的使用示例。
摘要由CSDN通过智能技术生成

1.前言

在日常开发中,往往会有这样的需求:根据后端返回的数据,动态渲染出一颗多级导航菜单树,类似于计算机中资源管理器的样子。如下图所示:

要实现这样的需求,其实不难,只是对后端返回的数据源有要求,如果后端返回的数据能够很清楚的表现出节点与节点之间的层级关系,那么前端实现起来就易如反掌。

2.数据源格式

一般来说,要想动态的渲染出一个树形菜单,如下所示的数据源格式对前端开发人员来说是十分友好的。

var data = [

{

name: "父节点1",

children: [

{

name: "子节点11",

children:[

{

name: "叶子节点111",

children:[]

},

{

name: "叶子节点112",

children:[]

},

{

name: "叶子节点113",

children:[]

},

{

name: "叶子节点114",

children:[]

}

]

}

//...

]

},

];

后端返回这样的数据源格式,节点之间的层级关系一目了然,前端人员拿到数据,只需进行递归遍历,并判断children.length是否等于0,等于0表明当前节点已为叶子节点,停止遍历即可。在上一篇博文vue+element UI以组件递归方式实现多级导航菜单中,动态渲染多级导航菜单,也是推荐使用这种数据源格式的。

3.问题痛点

虽然前端人员想法是好的,但是在后端,这些数据通常是存储在关系型数据库中,后端开发将数据从数据库中取出来返回给前端的数据往往这样子的:

const data =[

{ id:1, pid:0, name:"父节点1" },

{ id:11, pid:1, name:"父节点11" },

{ id:111, pid:11, name:"叶子节点111" },

{ id:112, pid:11, name:"叶子节点112" },

{ id:113, pid:11, name:"叶子节点113" },

{ id:114

Vant的`TreeSelect`组件可以实现多级菜单的选择,通过传入树形结构的数据来生成多级菜单。以下是一个使用`TreeSelect`组件实现多级菜单的示例代码: ```html <template> <van-tree-select :items="items" :main-active-index="mainActiveIndex" :active-id="activeId" @item-click="onItemClick" @nav-click="onNavClick" /> </template> <script> export default { data() { return { items: [ { text: '选项1', id: 1, children: [ { text: '选项1-1', id: 11, children: [ { text: '选项1-1-1', id: 111 }, { text: '选项1-1-2', id: 112 } ] }, { text: '选项1-2', id: 12, children: [ { text: '选项1-2-1', id: 121 }, { text: '选项1-2-2', id: 122 } ] } ] }, { text: '选项2', id: 2, children: [ { text: '选项2-1', id: 21, children: [ { text: '选项2-1-1', id: 211 }, { text: '选项2-1-2', id: 212 } ] }, { text: '选项2-2', id: 22, children: [ { text: '选项2-2-1', id: 221 }, { text: '选项2-2-2', id: 222 } ] } ] } ], mainActiveIndex: 0, activeId: '' }; }, methods: { onItemClick(item) { this.activeId = item.id; }, onNavClick(index) { this.mainActiveIndex = index; } } }; </script> ``` 在这个示例中,我们传入了一个树形结构的数据数组`items`,每个节点包含了`text`和`id`属性,以及可选的`children`属性。在`TreeSelect`组件中,我们设置了`items`属性来传入数据,同时监听了`item-click`和`nav-click`事件来处理选中的节点和导航栏的点击。在模板中,我们使用了`main-active-index`和`active-id`属性来控制导航栏和选中的节点。 需要注意的是,由于`TreeSelect`组件的数据格式比较特殊,如果需要从其他数据源中获取数据,可能需要对数据进行转换。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值