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移动div层-javascript 拖动层
Mar 22 Javascript
基于jquery ui的alert,confirm方案(支持换肤)
Apr 03 Javascript
js实现简单鼠标跟随效果的方法
Apr 10 Javascript
jquery实现标签上移、下移、置顶
Apr 26 Javascript
js实现使用鼠标拖拽切换图片的方法
May 04 Javascript
JavaScript中数据结构与算法(四):串(BF)
Jun 19 Javascript
浅谈jQuery中setInterval()方法
Jul 07 Javascript
详细分析JavaScript函数定义
Jul 16 Javascript
javascript制作幻灯片(360度全景图片)
Jul 28 Javascript
jQuery实现带幻灯的tab滑动切换风格菜单代码
Aug 27 Javascript
Vue props 单向数据流的实现
Nov 06 Javascript
vue项目中使用多选框的实例代码
Jul 22 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
Centos 6.5系统下编译安装PHP 7.0.13的方法
2016/12/19 PHP
php简单生成一组与多组随机字符串的方法
2017/05/09 PHP
详谈PHP中public,private,protected,abstract等关键字的用法
2017/12/31 PHP
详解在YII2框架中使用UEditor编辑器发布文章
2018/11/02 PHP
document对象execCommand的command参数介绍
2006/08/01 Javascript
jQuery 使用手册(三)
2009/09/23 Javascript
js 创建快捷方式的代码(fso)
2010/11/19 Javascript
基于jQuery中对数组进行操作的方法
2013/04/16 Javascript
通过正则表达式实现表单验证是否为中文
2014/02/18 Javascript
js简单抽奖代码
2015/01/16 Javascript
轻松学习jQuery插件EasyUI EasyUI创建RSS Feed阅读器
2015/11/30 Javascript
es6学习笔记之Async函数基本教程
2017/05/11 Javascript
iscroll动态加载数据完美解决方法
2017/07/18 Javascript
详解vue-cli项目中用json-sever搭建mock服务器
2017/11/02 Javascript
Ant design vue table 单击行选中 勾选checkbox教程
2020/10/24 Javascript
vant 解决tab切换插件标题样式自定义的问题
2020/11/13 Javascript
10分钟学会js处理json的常用方法
2020/12/06 Javascript
Tornado服务器中绑定域名、虚拟主机的方法
2014/08/22 Python
使用Python保存网页上的图片或者保存页面为截图
2016/03/05 Python
Python中遇到的小问题及解决方法汇总
2017/01/11 Python
Python自然语言处理之词干,词形与最大匹配算法代码详解
2017/11/16 Python
python tkinter之顶层菜单、弹出菜单实例
2020/03/04 Python
解决python运行启动报错问题
2020/06/01 Python
python关于倒排列的知识点总结
2020/10/13 Python
Django自带的用户验证系统实现
2020/12/18 Python
Html5应用程序缓存(Cache manifest)
2018/06/04 HTML / CSS
医学实习生自我鉴定
2013/12/12 职场文书
服务承诺书范文
2014/05/19 职场文书
公司承诺书怎么写
2014/05/24 职场文书
我为党旗添光彩演讲稿
2014/09/13 职场文书
婚庆答谢词
2015/01/04 职场文书
2015教师年度思想工作总结
2015/04/30 职场文书
毕业生登记表班级意见
2015/06/05 职场文书
《文化苦旅》读后感:阅读,让人诗意地栖居在大地上
2019/12/24 职场文书
2021年pycharm的最新安装教程及基本使用图文详解
2021/04/03 Python
idea搭建可运行Servlet的Web项目
2021/06/26 Java/Android