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宝典学习笔记
Feb 07 Javascript
javascript与CSS复习(《精通javascript》)
Jun 29 Javascript
javascript 判断中文字符长度的函数代码
Aug 27 Javascript
5秒后跳转到另一个页面的js代码
Oct 12 Javascript
javascript实现的一个随机点名功能
Aug 26 Javascript
JavaScript操作Cookie详解
Feb 28 Javascript
通过实例理解javascript中没有函数重载的概念
Jun 03 Javascript
简介EasyUI datagrid editor combogrid搜索框的实现
Apr 01 Javascript
form表单转Json提交的方法(推荐)
Sep 23 Javascript
Bootstrap fileinput文件上传预览插件使用详解
May 16 Javascript
微信小程序云开发详细教程
May 16 Javascript
Vue2.0 ES6语法降级ES5的操作
Oct 30 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
松下Panasonic RF-B65电路分析
2021/03/02 无线电
php 获得汉字拼音首字母的函数
2009/08/01 PHP
PHP中数据库单例模式的实现代码分享
2014/08/21 PHP
symfony表单与页面实现技巧
2015/01/26 PHP
laravel 框架执行流程与原理简单分析
2020/02/01 PHP
再谈Yii Framework框架中的事件event原理与应用
2020/04/07 PHP
My Desktop :) 桌面式代码
2008/12/29 Javascript
javascript 广告后加载,加载完页面再加载广告
2010/11/25 Javascript
Jquery跨域获得Json时invalid label错误的解决办法
2011/01/11 Javascript
js比较和逻辑运算符的介绍
2013/03/10 Javascript
javascript数组操作总结和属性、方法介绍
2014/04/05 Javascript
jquery中用jsonp实现搜索框功能
2016/10/18 Javascript
jQuery Easy UI中根据第一个下拉框选中的值设置第二个下拉框是否可以编辑
2016/11/29 Javascript
JavaScript调试的多个必备小Tips
2017/01/15 Javascript
jquery 获取索引值在一定范围的列表方法
2018/01/25 jQuery
vue生成文件本地打开查看效果的实例
2018/09/06 Javascript
[40:50]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS LGD第四场
2014/05/24 DOTA
Python远程桌面协议RDPY安装使用介绍
2015/04/15 Python
Python 处理数据的实例详解
2017/08/10 Python
利用python解决mysql视图导入导出依赖的问题
2017/12/17 Python
深入了解如何基于Python读写Kafka
2019/12/31 Python
pytorch的梯度计算以及backward方法详解
2020/01/10 Python
Python网页解析器使用实例详解
2020/05/30 Python
使用Python构造hive insert语句说明
2020/06/06 Python
Python计算信息熵实例
2020/06/18 Python
用ldap作为django后端用户登录验证的实现
2020/12/07 Python
草莓网官网:StrawberryNET
2019/08/21 全球购物
土木工程毕业生自荐信
2013/11/12 职场文书
优秀英语专业毕业生求职信
2013/11/23 职场文书
师德师风自我评价范文
2014/09/11 职场文书
小班上学期个人总结
2015/02/12 职场文书
离职证明格式样本
2015/06/12 职场文书
2016年11月份红领巾广播稿
2015/12/21 职场文书
八年级作文之我的母亲
2019/12/10 职场文书
如何将JavaScript将数组转为树形结构
2021/06/02 Javascript
JavaScript实现外溢动态爱心的效果的示例代码
2022/03/21 Javascript