vue基于Element构建自定义树的示例代码


Posted in Javascript onSeptember 19, 2017

说明

做项目的时候要使用到一个自定义的树形控件来构建表格树,在github上搜了一下没有搜索到合适的(好看的)可以直接用的,查看Element的组件说明时发现它的Tree控件可以使用render来自定义节点样式,于是基于它封装了一个可以增、删、改的树形组件,现在分享一下它的使用与实现。

控件演示

github上挂的gif可能会比较卡,有没有大佬知道还有哪里可以挂静态资源的,谢谢。。!

vue基于Element构建自定义树的示例代码

控件使用

概要

  • 基于element-ui树形控件的二次封装
  • 提供编辑、删除节点的接口
  • 提供一个next钩子,在业务处理失败时可使用next(false)回滚操作
  • 控件源码见 github

文档

props

属性 说明 类型
value 源数据,可使用v-model双向绑定 Array

events

事件名 说明 参数
SaveEdit 点击编辑或者添加树节点后的保存事件 (父节点数据、当前节点数据、next)
DelNode 删除节点事件 (父节点数据、当前节点数据、next)
NodeClick 节点点击事件 (当前节点数据)

源数据描述

属性 说明
value 树节点的唯一标识
label 树节点的显示名称
status (1:编辑状态)(0:显示状态)(-1不可编辑状态)
children 子节点数据

调用示例

<m-tree
  v-model="tableTree"
  @SaveEdit="SaveEdit"
  @DelNode="DelNode"
  @NodeClick="handleNodeClick"></m-tree>

SaveEdit(parentNode,data,next){
  var param = {
   parentNode:parentNode,
   node:data
  }
  this.$http.post(URL,param).then((response) => {
   if(response.status == 200){
    next(true,response.body.data.nodeId)
   }else{
    next(false)
   }
  })
}

实现方式

构建子节点的模板

<span class="span_item">
  <span @click="Expanded">
   <Input v-if="node.status == 1" style="width: 100px;" v-model="node.label" size="small" ></Input>
   <Icon v-if="node.status == 0" type="asterisk"></Icon>
   <Icon v-if="node.status == -1" type="ios-keypad-outline"></Icon>
   <span v-if="node.status != 1">{{node.label}}</span>
  </span>
  <span v-if="node.status == 1">
   <Button style="margin-left: 8px;" size="small" type="success" icon="checkmark-circled" @click="SaveEdit">确认</Button>
   <Button style="margin-left: 8px;" size="small" type="ghost" icon="checkmark-circled" @click="CancelEdit">取消</Button>
  </span>
  <span class="span_icon">
    <Icon v-if="node.status == 0" style="margin-left: 8px" color="gray" type="edit" size="16" @click.native="OpenEdit"></Icon>
    <Icon v-if="node.status == 0" style="margin-left: 8px" type="plus-round" color="gray" size="16" @click.native="Append"></Icon>
    <Icon v-if="node.status == 0&&node.children.length < 1" style="margin-left: 8px" type="ios-trash" color="red" size="18" @click.native="Delete"></Icon>
  </span>
 </span>

子节点通过$emit通知父节点事件

SaveEdit(){
  //保存节点事件
  this.$emit('SaveEdit',this.nodeData)
},

父节点核心实现,使用renderContent函数加载子节点模板,点击保存节点时将业务参数保存在runParam中用于在业务操作失败(网络请求失败、服务端异常等情况)的数据回滚

<el-tree
   class="filter-tree"
   style="overflow:auto;"
   :data="treeData"
   :filter-node-method="filterNode"
   @node-click="handleNodeClick"
   ref="tree"
   node-key="value"
   :expand-on-click-node="false"
   :render-content="renderContent"
   default-expand-all>
  </el-tree>
  //子节点模板
  renderContent(h, { node, data, store }) {
    return h(TreeItem,{
     props:{
      value:data,
      treeNode:node
     },
     on:{
      input:(node)=>{
       data = node
      },
      Append: () => {
       node.expanded = true
       data.children.push({ value: this.$utilHelper.generateUUID(), label: '请输入模块名称', children: [],status:1,isAdd:true })
      },
      //保存节点
      SaveEdit:(nodeData)=> {
       //递归查找父节点
       var parentNode = this.$utilHelper.getNode(this.treeData,data.value).parentNode
       this.runParam.parentNode = parentNode
       this.runParam.data = data
       this.runParam.nodeData = nodeData
       this.$emit('SaveEdit',parentNode,data,this.CanSaveNext)
      }
     }
    })
   }

操作结果钩子,如果next函数传入false则判定操作失败,使用runParam中的参数进行回滚,该节点的编辑保存操作将无效

源码demo:calebman/vue-DBM

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

Javascript 相关文章推荐
SharePoint 客户端对象模型 (一) ECMA Script
May 22 Javascript
javascript实现div的显示和隐藏的小例子
Jun 25 Javascript
Shell脚本实现Linux系统和进程资源监控
Mar 05 Javascript
jquery实现兼容IE8的异步上传文件
Jun 15 Javascript
如何用JavaScript实现动态修改CSS样式表
May 20 Javascript
引用jquery框架后出错的解决方法
Aug 09 Javascript
利用Js的console对象,在控制台打印调式信息测试Js的实现
Nov 26 Javascript
webpack下实现动态引入文件方法
Feb 22 Javascript
jquery 插件重新绑定的处理方法分析
Nov 23 jQuery
利用js实现简易红绿灯
Oct 15 Javascript
javascript 数组(list)添加/删除的实现
Dec 17 Javascript
字节飞书面试promise.all实现示例
Jun 16 Javascript
Vue2.0父组件与子组件之间的事件发射与接收实例代码
Sep 19 #Javascript
详解ES6之async+await 同步/异步方案
Sep 19 #Javascript
jQuery实现倒计时功能 jQuery实现计时器功能
Sep 19 #jQuery
jquery实现倒计时小应用
Sep 19 #jQuery
Angular客户端请求Rest服务跨域问题的解决方法
Sep 19 #Javascript
jQuery实现可兼容IE6的遮罩功能详解
Sep 19 #jQuery
jQuery选择器之表单元素选择器详解
Sep 19 #jQuery
You might like
PHP文件上传主要代码讲解
2013/09/30 PHP
PHP安全的URL字符串base64编码和解码
2014/06/19 PHP
ThinkPHP 表单自动验证运用示例
2014/10/13 PHP
php抓取网站图片并保存的实现方法
2015/10/29 PHP
在Thinkphp中使用ajax实现无刷新分页的方法
2016/10/25 PHP
syntaxhighlighter 使用方法
2007/07/02 Javascript
一个奇葩的最短的 IE 版本判断JS脚本
2014/05/28 Javascript
angularjs ocLazyLoad分步加载js文件实例
2017/01/17 Javascript
vue2.0 与 bootstrap datetimepicker的结合使用实例
2017/05/22 Javascript
深入理解react-router@4.0 使用和源码解析
2017/05/23 Javascript
vue高德地图之玩转周边
2017/06/16 Javascript
微信小程序开发之好友列表字母列表跳转对应位置
2017/09/26 Javascript
AngularJS 前台分页实现的示例代码
2018/06/07 Javascript
创建echart多个联动的示例代码
2018/11/23 Javascript
JS实现可用滑块滑动的缓动图代码
2019/09/01 Javascript
关于ckeditor在bootstrap中modal中弹框无法输入的解决方法
2019/09/11 Javascript
[02:09]抵达西雅图!中国军团加油!
2014/07/07 DOTA
[01:46]DOTA2上海特锦赛小组赛英文解说KotlGuy采访
2016/02/27 DOTA
[54:29]2018DOTA2亚洲邀请赛 4.7 淘汰赛 VP vs LGD 第二场
2018/04/09 DOTA
python使用socket连接远程服务器的方法
2015/04/29 Python
Python中常用操作字符串的函数与方法总结
2016/02/04 Python
如何在Python中编写并发程序
2016/02/27 Python
基于Pandas读取csv文件Error的总结
2018/06/15 Python
python基于Selenium的web自动化框架
2019/07/14 Python
pytorch 实现模型不同层设置不同的学习率方式
2020/01/06 Python
PyQt5 closeEvent关闭事件退出提示框原理解析
2020/01/08 Python
python logging设置level失败的解决方法
2020/02/19 Python
Python 通过监听端口实现唯一脚本运行方式
2020/05/05 Python
一个入门级python爬虫教程详解
2021/01/27 Python
英国简约舒适女装品牌:Great Plains
2018/07/27 全球购物
六月份红领巾广播稿
2014/02/03 职场文书
保证书范文大全
2014/04/28 职场文书
导游词400字
2015/02/13 职场文书
行政处罚告知书
2015/07/01 职场文书
Python中os模块的简单使用及重命名操作
2021/04/17 Python
Java常用函数式接口总结
2021/06/29 Java/Android