element el-tree组件的动态加载、新增、更新节点的实现


Posted in Javascript onFebruary 27, 2020

最近在根据需求,需要用到树形控件,ele 的封装了树形控件正好拿来用,用的途中遇到一些问题就总结下,哈哈哈

说正事,我需要动态的加载出整个树形结构,刚好就有

element el-tree组件的动态加载、新增、更新节点的实现

符合需求,啦啦啦

用的时候出现问题了,我要如何把后台返回个我的数据加载到表里呢,上菜。。。

<template>
	<el-tree
   empty-text="暂无数据"
   :expand-on-click-node="false"
   :props="defaultProps"
   :load="loadNode"
   node-key="id"
   lazy>
   <div class="custom-tree-node" slot-scope="{ node, data }">
    <div class="fl"><i class="el-icon-menu"></i>{{ node.label }}</div>
    <div class="fr">
     <el-button
      type="primary"
      size="mini"
      @click="() => addDialogShow(node, data, 0)">
      新增
     </el-button>
     <el-button
      type="primary"
      plain 
      size="mini"
      @click="() => addDialogShow(node, data, 1)">
      更新
     </el-button>
     <!-- <el-button
      disabled
      type="danger"
      size="mini"
      @click="() => remove(node, data)">
      删除
     </el-button> -->
    </div>
   </div>
  </el-tree>
</template>

el-tree 标准样式了

部分

<script>
 import { typeList, addtype, updatetype, deltype } from '@/api/baseType'

 export default {
  data() {
   return {
    defaultProps: {
      id: "Id",
      label: 'Name',
      children: 'children'
    },
    //新增相关
    addDialog:false,
    addForm: {},
    addRules:{
     name:[{required: true,message: '请输入基础类型名',trigger: 'blur'}]
    },
    pid: null, // 基础类型得父级id
    flag: null, //操作标志位
    node: {}, // tree 节点对象
    nodedata: {} 
   }
  },
  created(){
  },
  methods: {
   // 加载树结点
   loadNode(node, resolve) {
    // 如果是顶级的父节点
    if (node.level === 0) {
     // 查找顶级对象
     typeList(node.level).then(res => {
      if (res.Data) {
       return resolve(res.Data)
      } else {
       this.$message.error(res.Msg)
      }
     }).catch(() => {
      let data = []
      return resolve(data)
     })
    } else {
     // 根据父节点id找寻下一级的所有节点 
     typeList(node.data.Id).then(res => {
      if (res.Data) {
       return resolve(res.Data)
      } else {
       this.$message.error(res.Msg)
      }
     }).catch(() => {
      let data = []
      return resolve(data)
     })
    }
   },
   remove(node, data) {
    console.log(node, data)
    // const parent = node.parent;
    // const children = parent.data.children || parent.data;
    // const index = children.findIndex(d => d.id === data.id);
    // children.splice(index, 1);
   },
   //新增
   addDialogShow(node,data,flag) {
    this.node = node //
    this.nodedata = data
    if(flag === 0) {
     this.addDialog = true
     this.pid = data.Id
     this.flag = 0
    }
    if(flag === 1) {
     this.addDialog = true
     this.pid = data.Id
     this.addForm.name = data.Name
     this.flag = 1
    }
   },
   addSubmit(flag) {
    this.$refs.addForm.validate((valid) => {
     if(valid){
      this.listLoading = true
      let arr = Object.assign({}, this.addForm)
      console.log(flag)
      if(flag === 0) {
       let data = {
        pid: this.pid,
        name: arr.name
       }
       // 新增 api
       addtype(data).then(() => {
        typeList(data.pid).then(res => {
         let id = res.Data[0].Id 
         const newChild = { id: id, label: arr.name, children: [] };
         if (!this.nodedata.children) {
          this.$set(nodedata, 'children', []);
         }
         this.nodedata.children.push(newChild)
         this.addDialog = false
         this.$notify.success({
          message:'新增成功',
          duration: 2000
         })
        })
       }).catch(() => {
        this.addDialog = false
       })
      }
      if(flag === 1) {
       let data = {
        name: arr.name
       }
       updatetype(this.pid,data).then(res => {
        this.$set(this.node.data, 'Name',arr.name)
        this.addDialog = false
        this.$notify.success({
         message:'更新成功',
         duration: 2000
        })
       }).catch(() => {
        this.addDialog = false
       })
      }
     }
    })
   }
  }
 }
</script>

动态的加载树形数据 这里通过对ele 提供的方法
这里对 el-tree 的样式做了些许的改变
这个看个人需要了

<style lang="less" scoped>
 .el-tree-node__content {
  line-height: 50px;
  .custom-tree-node {
   width: 100%;
   display: block;
   .fl {
    float: left;
    line-height: 31px;
   }
   .fr {
    float: right;
    margin-right: 50px;
   }
  }
 }
</style>

动态加载节点数据,这里通过 ele 提供的 loadNode() 方法 可以根据个人需要改写

这里我是用弹出框进行信息的管理
实现动态的后台数据更新 和 前台显示的刷新,

addDialogShow(node,data,flag) {
	this.node = node // 这里对nodetree 进行了预先存储
  this.nodedata = data
}

element el-tree组件的动态加载、新增、更新节点的实现

然后 在更行后台api 成功后 通过 Vue.$set() 刷新子节点数据

let arr = Object.assign({}, this.addForm) //获取输入框输入的数据

 updatetype(this.pid,data).then(res => {
   this.$set(this.node.data, 'Name',arr.name) //同步刷新
   this.addDialog = false
   this.$notify.success({
    message:'更新成功',
    duration: 2000
   })
  }).catch(() => {
   this.addDialog = false
  })
 }

到此这篇关于element el-tree组件的动态加载、新增、更新节点的实现的文章就介绍到这了,更多相关element el-tree动态加载、新增、更新节点内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
封装好的省市地区联动控件附下载
Aug 13 Javascript
JavaScript中的私有/静态属性介绍
Jul 26 Javascript
利用javascript实现全部删或清空所选的操作
May 27 Javascript
jquery使用slideDown实现模块缓慢拉出效果的方法
Mar 27 Javascript
7个有用的jQuery代码片段分享
May 19 Javascript
jQuery获取checkbox选中的值
Jan 28 Javascript
Javascript的无new构建实例详解
May 15 Javascript
轻松掌握JavaScript中的Math object数学对象
May 26 Javascript
JavaScript三种绑定事件方式及相互之间的区别分析
Jan 10 Javascript
es7学习教程之Decorators(修饰器)详解
Jul 21 Javascript
React Native中TabBarIOS的简单使用方法示例
Oct 13 Javascript
node创建Vue项目步骤详解
Mar 06 Javascript
element-ui table行点击获取行索引(index)并利用索引更换行顺序
Feb 27 #Javascript
微信小程序录音实现功能并上传(使用node解析接收)
Feb 26 #Javascript
BootStrap前端框架使用方法详解
Feb 26 #Javascript
原生javascript制作贪吃蛇小游戏的方法分析
Feb 26 #Javascript
javascript 数组精简技巧小结
Feb 26 #Javascript
vue父子模板传值问题解决方法案例分析
Feb 26 #Javascript
jquery实现直播视频弹幕效果
Feb 25 #jQuery
You might like
php自动适应范围的分页代码
2008/08/05 PHP
php使用wordwrap格式化文本段落的方法
2015/03/17 PHP
使用jquery插件实现图片延迟加载技术详细说明
2011/03/12 Javascript
jquery插件制作 表单验证实现代码
2012/08/17 Javascript
js/jQuery简单实现选项卡功能
2014/01/02 Javascript
JavaScript中的正则表达式简明总结
2014/04/04 Javascript
JQuery实现动态适时改变字体颜色的方法
2015/03/10 Javascript
jQuery实现html表格动态添加新行的方法
2015/05/28 Javascript
javascript实现状态栏中文字动态显示的方法
2015/10/20 Javascript
js+canvas绘制五角星的方法
2016/01/28 Javascript
window.onload绑定多个事件的两种解决方案
2016/05/15 Javascript
jQuery过滤特殊字符及JS字符串转为数字
2016/05/26 Javascript
AngularJS 中的事件详解
2016/07/28 Javascript
浅析Javascript ES6新增值比较函数Object.is
2016/08/24 Javascript
详解如何提高 webpack 构建 Vue 项目的速度
2017/07/03 Javascript
深入研究jQuery图片懒加载 lazyload.js使用方法
2017/08/16 jQuery
详解React Native顶|底部导航使用小技巧
2017/09/14 Javascript
ionic选择多张图片上传的示例代码
2017/10/10 Javascript
create-react-app修改为多页面支持的方法
2018/05/17 Javascript
详解webpack之图片引入-增强的file-loader:url-loader
2018/10/08 Javascript
python实现迭代法求方程组的根过程解析
2019/11/25 Javascript
js实现网页版贪吃蛇游戏
2020/02/22 Javascript
JavaScript实现拖拽和缩放效果
2020/08/24 Javascript
Vue基本指令实例图文讲解
2021/02/25 Vue.js
python僵尸进程产生的原因
2017/07/21 Python
Pytorch DataLoader 变长数据处理方式
2020/01/08 Python
css3 clip实现圆环进度条的示例代码
2018/02/07 HTML / CSS
应届生骨科医生求职信
2013/10/31 职场文书
护理专业推荐信
2013/11/07 职场文书
工商企业管理实习自我鉴定
2013/12/04 职场文书
关于爱情的广播稿
2014/01/16 职场文书
追悼会主持词
2014/03/20 职场文书
家长意见书
2015/06/04 职场文书
golang 实现对Map进行键值自定义排序
2021/04/28 Golang
交互式可视化js库gojs使用介绍及技巧
2022/02/18 Javascript
零基础学java之带参数以及返回值的方法
2022/04/10 Java/Android