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 输入框内容格式验证代码
Feb 11 Javascript
JS、CSS加载中的小问题探讨
Nov 26 Javascript
JavaScript网页定位详解
Jan 13 Javascript
javascript实现ecshop搜索框键盘上下键切换控制
Mar 18 Javascript
JavaScript多并发问题如何处理
Oct 28 Javascript
原生JavaScript实现Ajax的方法
Apr 07 Javascript
BootStrap 轮播插件(carousel)支持左右手势滑动的方法(三种)
Jul 07 Javascript
Knockout结合Bootstrap创建动态UI实现产品列表管理
Sep 14 Javascript
详解webpack3如何正确引用并使用jQuery库
Aug 26 jQuery
Angular2监听页面大小变化的解决方法
Oct 09 Javascript
Json实现传值到后台代码实例
Jun 30 Javascript
JavaScript 声明私有变量的两种方式
Feb 05 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/06/18 PHP
PHP生成等比缩略图类和自定义函数分享
2014/06/25 PHP
PHP清除字符串中所有无用标签的方法
2014/12/01 PHP
基于PHP给大家讲解防刷票的一些技巧
2015/11/18 PHP
thinkphp实现把数据库中的列的值存到下拉框中的方法
2017/01/20 PHP
简单的前端js+ajax 购物车框架(入门篇)
2011/10/29 Javascript
js 手机号码合法性验证代码集合
2012/09/29 Javascript
九种js弹出对话框的方法总结
2013/03/12 Javascript
jquery实现图片等比例缩放以及max-width在ie中不兼容解决
2013/03/21 Javascript
深入浅出理解javaScript原型链
2015/05/09 Javascript
JavaScript实现DIV层拖动及动态增加新层的方法
2015/05/12 Javascript
基于jQuery实现放大镜特效
2020/10/19 Javascript
AngularJS中的$watch(),$digest()和$apply()区分
2016/04/04 Javascript
基于Vuejs的搜索匹配功能实现方法
2018/03/03 Javascript
页面内锚点定位及跳转方法总结(推荐)
2019/04/24 Javascript
package.json配置文件构成详解
2019/08/27 Javascript
js简单实现自动生成表格功能示例
2020/06/02 Javascript
基于NodeJS开发钉钉回调接口实现AES-CBC加解密
2020/08/20 NodeJs
微信小程序将页面按钮悬浮固定在底部的实现代码
2020/10/29 Javascript
Linux上安装Python的PIL和Pillow库处理图片的实例教程
2016/06/23 Python
Python 网页解析HTMLParse的实例详解
2017/08/10 Python
Scrapy抓取京东商品、豆瓣电影及代码分享
2017/11/23 Python
Python实现嵌套列表及字典并按某一元素去重复功能示例
2017/11/30 Python
Python Tkinter模块 GUI 可视化实例
2019/11/20 Python
matplotlib阶梯图的实现(step())
2021/03/02 Python
美国最大的袜子制造商和零售商:Renfro Socks
2017/09/03 全球购物
Janie and Jack美国官网:GAP旗下的高档童装品牌
2019/09/09 全球购物
学生处主任岗位职责
2013/12/01 职场文书
甜点店创业计划书
2014/01/27 职场文书
优秀大学生职业生涯规划书
2014/02/27 职场文书
高校教师个人工作总结2014
2014/12/17 职场文书
公司内部升职自荐信
2015/03/27 职场文书
2015年事业单位办公室文员工作总结
2015/04/24 职场文书
警告通知
2015/04/25 职场文书
2015年世界环境日活动方案
2015/05/05 职场文书
mysql 乱码 字符集latin1转UTF8
2022/04/19 MySQL