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 中的事件教程
Apr 05 Javascript
jquery text,radio,checkbox,select操作实现代码
Jul 09 Javascript
JavaScript 浮点数运算 精度问题
Oct 06 Javascript
Javascript类定义语法,私有成员、受保护成员、静态成员等介绍
Dec 08 Javascript
JavaScript中__proto__与prototype的关系深入理解
Dec 04 Javascript
javascript中的nextSibling使用陷(da)阱(keng)
May 05 Javascript
分享9点个人认为比较重要的javascript 编程技巧
Apr 27 Javascript
关于Javascript中defer和async的区别总结
Sep 20 Javascript
浅谈Webpack 是如何加载模块的
May 24 Javascript
微信小程序视图控件与bindtap之间的问题的解决
Apr 08 Javascript
js实现简单分页导航栏效果
Jun 28 Javascript
JS中间件设计模式的深入探讨与实例分析
Apr 11 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中运用http调用的GET和POST方法示例
2014/09/29 PHP
Laravel构建即时应用的一种实现方法详解
2017/08/31 PHP
thinkPHP框架通过Redis实现增删改查操作的方法详解
2019/05/13 PHP
php用wangeditor3实现图片上传功能
2019/08/22 PHP
TP5框架实现的数据库备份功能示例
2020/04/05 PHP
js 巧妙去除数组中的重复项
2010/01/25 Javascript
JSQL 批量图片切换的实现代码
2010/05/05 Javascript
JS在可编辑的div中的光标位置插入内容的方法
2014/11/20 Javascript
浅谈javascript中的DOM方法
2015/07/16 Javascript
全面解析Bootstrap手风琴效果
2020/04/17 Javascript
深入学习js瀑布流布局
2016/10/14 Javascript
微信小程序 网络API Websocket详解
2016/11/09 Javascript
原生js编写焦点图效果
2016/12/08 Javascript
angularjs+bootstrap菜单的使用示例代码
2017/03/07 Javascript
5分钟打造简易高效的webpack常用配置
2017/07/04 Javascript
微信小程序实现选项卡功能
2020/06/19 Javascript
在create-react-app中使用css modules的示例代码
2018/07/31 Javascript
vue的.vue文件是怎么run起来的(vue-loader)
2018/12/10 Javascript
vue.js仿hover效果的实现方法示例
2019/01/28 Javascript
vue实现二级导航栏效果
2019/10/19 Javascript
微信小程序实现比较功能的方法汇总(五种方法)
2020/03/07 Javascript
Python 用Redis简单实现分布式爬虫的方法
2017/11/23 Python
利用python实现周期财务统计可视化
2019/08/25 Python
tensorflow多维张量计算实例
2020/02/11 Python
Python改变对象的字符串显示的方法
2020/08/01 Python
Django实现文章详情页面跳转代码实例
2020/09/16 Python
sublime3之内网安装python插件Anaconda的流程
2020/11/10 Python
阿玛尼美妆加拿大官方商城:Giorgio Armani Beauty加拿大
2017/10/24 全球购物
护理专业自荐信
2013/12/03 职场文书
乌鸦喝水教学反思
2014/02/07 职场文书
2014年两会学习心得体会
2014/03/10 职场文书
创业者迈进成功第一步:如何写创业计划书?
2014/03/22 职场文书
《沉香救母》教学反思
2014/04/19 职场文书
领导干部作风整顿个人剖析材料
2014/10/11 职场文书
学生检讨书范文
2014/10/30 职场文书
城南旧事读书笔记
2015/06/29 职场文书