开发Vue树形组件的示例代码


Posted in Javascript onDecember 21, 2017

本文介绍了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事件。

但是在使用体验上,很明显,工具栏组件的点击事件定义应该是定义在app组件的events里面的才是合理。我们希望menubar:[]定义菜单项时,不管多少级嵌套,事件的触发均可以冒泡到最上面的menubar的父上面。
因此,要实现该机制,目前是采用组件之间的通讯机制来实现的:

<a @click="onMenuItemClick(item,$event)" data-tab="{{item.tab}}" v-link="item.vlink" href="{{item.url}}" rel="external nofollow" v-if="!item.children" :class="[{'active':item.active==true,'disabled':item.enabled==false},item.color,'item']" title="{{item.tips}}"> 
     <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>

上面定义一个事件@click="onMenuItemClick(item,$event)"

methods:{ 
  onMenuItemClick:function(item,$event){    
   if(this.subMenu){ 
    this.$dispatch("menuItemClick",item,$event)  
   }else{ 
    if(item.click){ 
     this.$parent.$emit(item.click,item) 
    } 
   }   
  } 
 }

在onMenuItemClick触发时,我们根据传入的subMenu来确认点击事件如何处理,如果Menubar是作为子菜单栏处理,则我们就直接向上冒泡事件,否则就在上层父组件触发事件。

<menubar  @menuItemClick="onMenuItemClick" :items="rightItems" sub-menu="true" v-if="rightItems.length > 0"></menubar>

在menubar组件内部调用时就传入submenu=true,并且侦听事件menuItemClick,menuItemClick事件代码这样:

events:{ 
  menuItemClick:function(item,$event){ 
   if(!this.subMenu){ 
    this.$parent.$emit(item.click,item) 
   }else{ 
    return true 
   } 
  } 
 },

小结一下:

在处理嵌套结构的组件,如具有下拉菜单的工具栏、树形组件等时,由于组件内部均具有各自独立的上下文,因此必须使用组件通讯机制来处理内部组件间的通讯。

但如此处理方式,我觉得还是比较麻烦的,理想的方式,我觉得最好的官方可以为组件提供一个直接使用父组件上下文的机制,例如:

<MenuBar> 
 <button scoped="false"></button> 
<button scoped="false"></button> 
</MenuBar>

这样上面的button就没有自己的上下文,而可以直接引入父组件的上下文,这样模式应该在很多场合均会使用到的。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JS动态创建Table,Tr,Td并赋值的具体实现
Jul 05 Javascript
JavaScript中判断对象类型的几种方法总结
Nov 11 Javascript
Javascript对象属性方法汇总
Nov 21 Javascript
浅谈Javascript中匀速运动的停止条件
Dec 19 Javascript
javascript中attachEvent用法实例分析
May 14 Javascript
jQuery实现本地预览上传图片功能
Jan 08 Javascript
利用JQuery写一个简单的异步分页插件
Mar 07 Javascript
thinkphp标签实现bootsrtap轮播carousel实例代码
Feb 19 Javascript
详解vue-cli + webpack 多页面实例配置优化方法
Jul 13 Javascript
vue如何获取点击事件源的方法
Aug 10 Javascript
JS中通过url动态获取图片大小的方法小结(两种方法)
Oct 31 Javascript
使用webpack5从0到1搭建一个react项目的实现步骤
Dec 16 Javascript
详解使用vuex进行菜单管理
Dec 21 #Javascript
Angular5.1新功能分享
Dec 21 #Javascript
vue2中的keep-alive使用总结及注意事项
Dec 21 #Javascript
webpack写jquery插件的环境配置
Dec 21 #jQuery
基于Vue 2.0的模块化前端 UI 组件库小结
Dec 21 #Javascript
使用Bootstrap4 + Vue2实现分页查询的示例代码
Dec 21 #Javascript
详解设置Webstorm 利用babel将ES6自动转码成ES5
Dec 20 #Javascript
You might like
生成静态页面的php函数,php爱好者站推荐
2007/03/19 PHP
shopex主机报错误请求解决方案(No such file or directory)
2011/12/27 PHP
PHP Error与Logging函数的深入理解
2013/06/03 PHP
ci检测是ajax还是页面post提交数据的方法
2014/11/10 PHP
jQuery Div中加载其他页面的实现代码
2009/02/27 Javascript
Struts2的s:radio标签使用及用jquery添加change事件
2013/04/08 Javascript
Jquery图片延迟加载插件jquery.lazyload.js的使用方法
2014/05/21 Javascript
jQuery 删除或是清空某个HTML元素示例
2014/08/04 Javascript
JS实现下拉菜单赋值到文本框的方法
2015/08/18 Javascript
jquery实现最简单的滑动菜单效果代码
2015/09/12 Javascript
JavaScript弹出对话框的三种方式
2016/03/23 Javascript
第一篇初识bootstrap
2016/06/21 Javascript
微信小程序 wxapp视图容器 view详解
2016/10/31 Javascript
jQuery焦点图左右转换效果
2016/12/12 Javascript
Javascript Event(事件)的传播与冒泡
2017/01/23 Javascript
使用layer模态框给新页面传值的方法
2019/09/27 Javascript
详解Vue 单文件组件的三种写法
2020/02/19 Javascript
微信小程序中使用 async/await的方法实例分析
2020/05/06 Javascript
python使用wmi模块获取windows下的系统信息 监控系统
2015/10/27 Python
Python断言assert的用法代码解析
2018/02/03 Python
python高级特性和高阶函数及使用详解
2018/10/17 Python
解决vscode python print 输出窗口中文乱码的问题
2018/12/03 Python
Python基于百度云文字识别API
2018/12/13 Python
Python flask框架post接口调用示例
2019/07/03 Python
Python 面向对象之封装、继承、多态操作实例分析
2019/11/21 Python
解决pyecharts运行后产生的html文件用浏览器打开空白
2020/03/11 Python
css3实现画半圆弧线的示例代码
2017/11/06 HTML / CSS
Servlet的实例是在生命周期什么时候创建的?配置servlet最重要的是什么?
2012/05/30 面试题
管事部库房保管员岗位职责
2014/02/21 职场文书
财务管理专业毕业生求职信
2014/06/02 职场文书
法院反腐倡廉心得体会
2014/09/09 职场文书
政风行风自查自纠报告
2014/10/21 职场文书
地心历险记观后感
2015/06/15 职场文书
趣味运动会标语口号
2015/12/26 职场文书
html输入两个数实现加减乘除功能
2021/07/01 HTML / CSS
Python开发五子棋小游戏
2022/04/28 Python