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 相关文章推荐
用js实现的抽象CSS圆角效果!!
May 03 Javascript
ext jquery 简单比较
Apr 07 Javascript
一个简单的JavaScript数据缓存系统实现代码
Oct 24 Javascript
深入理解javascript学习笔记(一) 编写高质量代码
Aug 09 Javascript
单击和双击事件的冲突处理示例代码
Apr 03 Javascript
window.onload使用指南
Sep 13 Javascript
javascript实现动态标签云
Oct 16 Javascript
Bootstrap3 内联单选和多选框
Dec 29 Javascript
angular ng-repeat数组中的数组实例
Feb 18 Javascript
jquery.picsign图片标注组件实例详解
Feb 02 jQuery
微信小程序自定义modal弹窗组件的方法详解
Dec 20 Javascript
Vue.js中v-bind指令的用法介绍
Mar 13 Vue.js
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提取中文首字母
2008/04/09 PHP
Discuz7.2版的faq.php SQL注入漏洞分析
2014/08/06 PHP
PHP如何实现跨域
2016/05/30 PHP
详解Laravel服务容器的绑定与解析
2019/11/05 PHP
一行命令搞定node.js 版本升级
2014/07/20 Javascript
jquery提示效果实例分析
2014/11/25 Javascript
jQuery实现感应鼠标动画效果自动伸长的输入框实例
2015/02/24 Javascript
jquery.gridrotator实现响应式图片展示画廊效果
2015/06/23 Javascript
Windows系统下Node.js的简单入门教程
2015/06/23 Javascript
js实现继承的5种方式
2015/12/01 Javascript
jQuery实现二级下拉菜单效果
2016/01/05 Javascript
JavaScript+html5 canvas绘制的小人效果
2016/01/27 Javascript
jquery根据td给相同tr下其他td赋值的实现方法
2016/10/05 Javascript
Bootstrap路径导航与分页学习使用
2017/02/08 Javascript
详解Vue中使用v-for语句抛出错误的解决方案
2017/05/04 Javascript
解决JS外部文件中文注释出现乱码问题
2017/07/09 Javascript
详解如何使用PM2将Node.js的集群变得更加容易
2017/11/15 Javascript
微信小程序实现弹出菜单
2018/07/19 Javascript
JS阻止事件冒泡的方法详解
2019/08/26 Javascript
python基于mysql实现的简单队列以及跨进程锁实例详解
2014/07/07 Python
Python中使用ConfigParser解析ini配置文件实例
2014/08/30 Python
Python写的一个简单监控系统
2015/06/19 Python
同时安装Python2 &amp; Python3 cmd下版本自由选择的方法
2017/12/09 Python
使用 Python 写一个简易的抽奖程序
2019/12/08 Python
tensorflow使用range_input_producer多线程读取数据实例
2020/01/20 Python
Tensorflow 1.0之后模型文件、权重数值的读取方式
2020/02/12 Python
python读取图片颜色值并生成excel像素画的方法实例
2021/02/19 Python
CSS3中动画属性transform、transition和animation属性的区别
2016/09/25 HTML / CSS
倩碧澳大利亚官网:Clinique澳大利亚
2019/07/22 全球购物
俄罗斯建筑和装饰材料在线商店:Stroilandia
2020/07/25 全球购物
急诊科护士自我鉴定
2013/10/14 职场文书
给同事的道歉信
2014/01/11 职场文书
销售类求职信
2014/06/13 职场文书
个人师德师风自我剖析材料
2014/09/29 职场文书
大三学生英语考试作弊检讨书
2015/01/01 职场文书
六一儿童节开幕词
2015/01/29 职场文书