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 相关文章推荐
jquery 必填项判断表单是否为空的方法
Sep 14 Javascript
Js nodeType 属性全面解析
Nov 14 Javascript
利用js动态添加删除table行的示例代码
Dec 16 Javascript
使用JavaScript刷新网页的方法
Jun 04 Javascript
jQuery学习笔记之Ajax用法实例详解
Dec 01 Javascript
javascript表单处理具体实现代码(表单、链接、按钮)
May 07 Javascript
JavaScript中的对象和原型(一)
Aug 12 Javascript
RequireJS简易绘图程序开发
Oct 28 Javascript
jquery实现提示语淡入效果
May 05 jQuery
easyui combogrid实现本地模糊搜索过滤多列
May 13 Javascript
Thinkphp5微信小程序获取用户信息接口的实例详解
Sep 26 Javascript
vue模式history下在iis中配置流程
Apr 17 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防止post重复提交数据的简单例子
2014/06/07 PHP
Linux下手动编译安装PHP扩展的例子分享
2014/07/15 PHP
PHP中数组转换为SimpleXML教程
2019/01/27 PHP
判断iframe是否加载完成的完美方法
2010/01/07 Javascript
Prototype源码浅析 Number部分
2012/01/16 Javascript
js判断变量是否未定义的代码
2020/03/28 Javascript
Javascript 学习笔记之 对象篇(二) : 原型对象
2014/06/24 Javascript
简单的jquery左侧导航栏和页面选中效果
2014/08/21 Javascript
用Jquery.load载入页面后样式没了页面混乱的解决方法
2014/10/20 Javascript
轻松创建nodejs服务器(9):实现非阻塞操作
2014/12/18 NodeJs
JavaScript设计模式经典之命令模式
2016/02/24 Javascript
jquery设置表单元素为不可用的简单代码
2016/07/04 Javascript
JS添加删除DIV的简单实例
2016/07/08 Javascript
js实现目录链接,内容跟着目录滚动显示的简单实例
2016/10/15 Javascript
vue2.X组件学习心得(新手必看篇)
2017/07/05 Javascript
彻底解决 webpack 打包文件体积过大问题
2017/07/07 Javascript
JavaScript中遍历的十种方法总结
2020/12/15 Javascript
python实现列表中由数值查到索引的方法
2018/06/27 Python
Python+threading模块对单个接口进行并发测试
2019/06/25 Python
Python使用Slider组件实现调整曲线参数功能示例
2019/09/06 Python
Pytorch mask_select 函数的用法详解
2020/02/18 Python
python针对Oracle常见查询操作实例分析
2020/04/30 Python
Camille Jewelry官网:现代女性时尚首饰
2019/07/07 全球购物
战友聚会邀请函
2014/01/18 职场文书
《口技》教学反思
2014/02/21 职场文书
学校政风行风自查自纠报告
2014/10/21 职场文书
乡镇党的群众路线教育实践活动制度建设计划
2014/11/03 职场文书
2014年网管工作总结
2014/12/11 职场文书
2014年小学美术工作总结
2014/12/20 职场文书
投标邀请书范本
2015/02/02 职场文书
新教师个人工作总结
2015/02/06 职场文书
中学生社会实践教育活动总结
2015/05/06 职场文书
消费者理赔投诉书
2015/07/02 职场文书
公务员岗前培训心得体会
2016/01/08 职场文书
PyTorch梯度裁剪避免训练loss nan的操作
2021/05/24 Python
关于nginx 实现jira反向代理的问题
2021/09/25 Servers