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 相关文章推荐
JavaScript高级程序设计阅读笔记(六) ECMAScript中的运算符(二)
Feb 27 Javascript
jQuery控制cookie过期时间的方法
Apr 07 Javascript
JavaScript表格常用操作方法汇总
Apr 15 Javascript
javascript如何写热点图
Dec 08 Javascript
php基于redis处理session的方法
Mar 14 Javascript
Js操作DOM元素及获取浏览器高宽的简单方法
Sep 08 Javascript
从零开始做一个pagination分页组件
Mar 15 Javascript
node.js连接MongoDB数据库的2种方法教程
May 17 Javascript
webpack4 入门最简单的例子介绍
Sep 05 Javascript
Cocos2d实现刮刮卡效果
Dec 20 Javascript
Vue 数组和对象更新,但是页面没有刷新的解决方式
Nov 09 Javascript
详解vue实现坐标拾取器功能示例
Nov 18 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的serialize序列化数据以及JSON格式化数据分析
2015/10/10 PHP
PHP实现的统计数据功能详解
2016/12/06 PHP
php获取目录中所有文件名及判断文件与目录的简单方法
2017/03/04 PHP
控制打印时页眉角的代码
2007/02/08 Javascript
ext 代码生成器
2009/08/07 Javascript
使用隐藏的new来创建对象
2011/03/29 Javascript
浅谈Javascript 执行顺序
2013/12/18 Javascript
jquery实现点击弹出层效果的简单实例
2014/03/03 Javascript
jquery获取复选框被选中的值
2014/04/10 Javascript
js实现文本框只允许输入数字并限制数字大小的方法
2015/08/19 Javascript
JS HTML图片显示Canvas 压缩功能
2017/07/21 Javascript
EasyUI在Panel上动态添加LinkButton按钮
2017/08/11 Javascript
深入理解ES6 Promise 扩展always方法
2017/09/26 Javascript
Thinkjs3新手入门之如何使用静态资源目录
2017/12/06 Javascript
Vue 解决路由过渡动画抖动问题(实例详解)
2020/01/05 Javascript
openlayers4实现点动态扩散
2020/08/17 Javascript
python实现机械分词之逆向最大匹配算法代码示例
2017/12/13 Python
Python切片索引用法示例
2018/05/15 Python
python命名空间(namespace)简单介绍
2019/08/10 Python
Django 实现xadmin后台菜单改为中文
2019/11/15 Python
django创建超级用户时指定添加其它字段方式
2020/05/14 Python
.NET面试问题集
2015/12/08 面试题
Linux的文件类型
2012/03/07 面试题
学习党课思想汇报
2013/12/29 职场文书
2014学校庆三八妇女节活动总结
2014/03/01 职场文书
幼儿园安全责任书
2014/04/14 职场文书
关于环保的演讲稿
2014/05/10 职场文书
计算机系本科生求职信
2014/05/31 职场文书
应届生找工作求职信
2014/06/24 职场文书
党的群众路线教育实践活动个人剖析材料
2014/10/07 职场文书
房屋租赁合同协议书范本
2014/10/19 职场文书
2014年稽查工作总结
2014/12/20 职场文书
在酒桌上的敬酒词
2015/08/12 职场文书
如何利用js在两个html窗口间通信
2021/04/27 Javascript
Python列表的索引与切片
2022/04/07 Python
详解Flutter网络请求Dio库的使用及封装
2022/04/14 Java/Android