本文介绍了Vue树形组件的示例代码,分享给大家,具体如下:
使用SemanticUI和vue做一个menubar组件,实现方法大概是这样的:
<template>
<div class="ui menu">
<template v-for="item in leftItems">
<a " v-if="!item.children" @click="item.click">
<i class="{{ item.icon }} icon" v-if="item.icon"></i>{{item.text}}
<div class="ui mini {{item.labelColor }} label" v-if="item.label">
{{item.label}}
</div>
</a>
//如果有有children则说明是下拉菜单项,然后递归调用自身
<template v-else="item.children.length > 0">
<div class="ui dropdown item">
<i class="{{ item.icon }} icon" v-if="item.icon"></i>
<div class="text"> {{item.text}}</div>
<menubar :items="item.children" ></menubar>
</div>
</template>
</template>
//显示在右侧的菜单项,也是递归调用自身
<menubar :items="rightItems" v-if="rightItems.length > 0"></menubar>
</div>
</template>
使用时,假如父组件app使用到了menubar组件,那么data中需要定义一下items数据,例 :
menubar:[
{id:"a",text:"主页1",icon:"home",tips:"提示",label:"33",labelColor:"red",url:"#"},
{id:"b",text:"菜单",icon:"edit",tips:"提示",url:"#",children:[
{id:"a",text:"菜单1",click:"test3",icon:"home",url:"#"},
{id:"a",text:"菜单2",click:"test3",icon:"home",url:"#"}
]},
{id:"bb",text:"编辑",tab:"a",icon:"user",vlink:"#"},
{id:"bb",text:"文件",tab:"b",icon:"user",click:"test1"},
{id:"bb",text:"帮助",tab:"c",icon:"help",click:"test2"},
{id:"bb",text:"工具",icon:"user",url:"www.baidu.com"},
{id:"c",text:"设置",icon:"home",tips:"提示",enabled:true,color:"blue",url:"#",right:true,label:"",children:[
{id:"bbb",text:"配置",icon:"home",tips:"提示",click:"test3"},
{id:"adsd",text:"退出",icon:"home",tips:"提示",vlink:"/workdesk",url:"#"}
]
}
]
里面的click事件是定义了,当在工具栏中单击时的事件,理想的情况应该是事件定义在父组件app的events里面,像这样:
events:{
eventa:function(){....},
eventb:function(){....},
}
工具栏组件是根据传入的items来生成的,包括里面的子组件。最终工具栏组件的结构就是一个树状结构,例似这样的:
MenuBar
--MenuBar
----MenuBar
-----MenuBar
--Menubar
由于每个工具栏组件里面的每个Menubar均有自己的上下文,这样当子组件Menubar的click事件触发时并不会调用到顶层app组件events里面定义的事件,而只是调用了父Menubar的events事件。
