vue实现tree组件增删改,

  vue实现tree组件增删改,

  本文主要介绍Vue使用el-tree懒加载进行添加、删除和检查,以懒加载的形式展现。根据需要,目录有新的编辑和删除操作,以及操作后刷新的树形结构。让我们来看看边肖的具体实现代码。

  vue的树形显示应用于项目:以树形的形式异步显示。

  先展示效果:

  找到element-ui的官方文档,el-tree。(地址:https://element.eleme.cn/#/zh-CN/component/tree)

  需求:以懒加载的形式展现。根据需求,目录新增了编辑和删除操作,并在操作后刷新了树结构。

  让我们现在开始。

  

一、

  懒惰加载:树的懒惰加载,由一个属性控制:懒惰。使用lazy,您需要使用load来加载数据以呈现树。

  原理:初始化触发加载函数先加载初始数据,然后点击一个节点触发加载函数加载该节点下的子节点。

  优点:适用于大数据量,刷新部分节点友好。

  

二、

  用户自定义节点:在节点后添加动作按钮。

  简单的例子官网有例子。

  **

  主要说说更新节点。

  **当对节点进行编辑、删除时,需要更新树,只需更新节点,不必更新全部的树即可。原理:更新节点。其实更新的节点是该节点的子节点,不包括这个节点。删除该节点的子节点,重新请求数据,获取该节点的子节点数据,进行重新渲染。

  //refreshNode:要刷新的节点;NewNodeData:新的子节点数据

  refreshNode.splice(0,refresh node . length);

  refresh node . docreate children(new nodedata);

  了解:

  1.方法node-click调用函数menuNodeClick来记录被点击的节点信息。在节点上操作之前,必须先单击选择一个节点。该函数监视节点点击事件,一旦节点被点击,它将触发:

  menuNodeClick(数据,节点,树节点){

  this.selectNodeData=data

  this.selectNode=node

  }

  2.您可以在节点操作后刷新节点。可以选择通过不同的场景刷新本节点(node)或者本节点的父节点(node.parent):

  /**

  *刷新节点数据

  * @node [node/Object]:刷新节点,刷新节点下的所有节点。

  * @ type [string]:节点的类型,‘Node’表示Node是树的节点信息节点;“数据”表示节点是树节点信息中的数据。

  */

  refreshTreeNode(节点,类型){

  让refreshNode

  //获取要更新的节点的子节点

  if(type===node) {

  refreshNode=节点.子节点

  }else if(type===data) {

  让getNode=this。$refs.tree.getNode(node)

  refreshNode=getNode.childNodes

  }

  //删除原来的子节点

  refreshNode.splice(0,refresh node . length);

  //重新请求数据并更新节点

  this.requestTreeNode(节点)

  }

  3.选中复选框复选框:

  如果在懒加载中有选择框,需要用选择框加载数据,然后通过属性default-checked-keys检查,通过default-expanded-keys设置展开的节点。

  4.单项选择:

  如果延迟加载只有一个选项,可以选择设置:

  //设置当前要选择的节点

  这个。$refs.tree.setCurrentKey(

  this . selectnodedata[this . node key]

  )

  不管是单选还是多选,第一次加载时,后台不仅会给你选中的信息,还会给你节点所在分支的所有节点信息,并赋给default-expanded-keys,这样节点所在分支就可以自上而下展开。但往往后台可能给出的只是选中值的信息,需要前端自己封装数据,获取需要扩展的分支信息。根据不同的数据格式,使用不同的方法。

  1)树形单层数据格式:

  [

  {.},

  {.},

  {.}

  ]

  对于这种格式的数据,可以同时满足【点击一个图层加载一个图层】和【点击一个图层加载被点击图层的多个子节点】。第一种不需要数据处理;第二种情况,需要在每条数据中注入一个字段关联父节点和子节点,然后将数据封装成el-tree要求的格式,用递归函数将数据整合(假设关联字段为parentId,nodeKey为Id,树的子节点字段为children,需要加载id为 n )的多级子节点(注意:递归函数会影响性能,要小心)

  2).多层数据(假设子节点的属性名是children)

  [

  {

  .

  儿童:[

  {

  .

  儿童:[

  {

  .

  儿童:[.],

  },

  {

  .

  儿童:[.],

  }

  ]

  },

  {

  .

  儿童:[

  {

  .

  儿童:[.],

  }

  ]

  }

  ]

  }

  ]

  这种格式的数据在单层和多层都可以满足,不需要任何处理。

  选择要整合的值,并展开所选值所在的树:对于多层数据,可以由背景给出所选节点所在的整个分支的值,分配给default-expanded-keys进行展开。也可以自己筛选,写一个递归函数,循环遍历多层数据,找到所选值的节点的分支设置展开(假设nodeKey是id,树的子节点字段是children,需要展开id为 n 的节点所在的整个分支)

  延迟加载的示例:

  HTML控件:

  el树

  :data=treeData

  :props=defaultProps

  :load=loadNodeTree

  @node-click=handleNodeClick

  懒惰的

  :expand-on-click-node=false

  :default-expanded-keys=[1]

  node-key=id

  :highlight-current=true

  span class= custom-tree-node slot-scope= { node,data }

  span class= tree left { node . label } }/span

   treeRight

  我

  v-if=node.level===1

  @click=()=appendNode(node,data)

   el-icon-plus

  style=color: blue

  /i

  !-添加分组-

  !-不需要删除和重命名根节点-

  我

  v-if=data.id!==0

  @click=()=deleteNode(node,data)

   el-icon-delete

  style=color: red

  /i

  !-删除分组-

  我

  v-if=data.id!==0

  @click=()=editNode(node,data)

   el-icon-edit

  style=color: blue

  /i

  !-重命名分组-

  /span

  /span

  /el-tree

  vue:

  数据定义变量。

  //树形菜单

  TreeData: [],//树节点

  DefaultProps: {//修改el-tree的默认数据数组参数

  孩子:“孩子”,

  标签:“名称”,

  id: id ,

  parentId: parentId ,

  IsLeaf: leaf //指定该节点是否为叶节点,仅当指定了lazy属性时才生效。

  },

  方法:

  加载树形菜单部分

  //加载树数据

  loadNodeTree(节点,解析){

  const那个=这个

  if (node.level===0) {

  that.loadtreeData(node,resolve)

  } else if (node.level===1) {

  that.getChildByList(node,resolve)

  }

  },

  //获取loadtreeData是父节点数据,getChildByList是异步获取子节点数据。

  loadtreeData(nodeData,resolve) {

  常量数据类型={

  pageIndex: 1,

  页面大小:100000

  }

  getAlltype(数据类型)。然后(res={

  const rootChildren=[]

  if (res.code===200) {

  const data=res.data.list

  data.map(item={

  rootChildren.push({

  名称:项目.类型名称

  parentId:" ",

  id: item.id,

  叶子:假的,

  儿童:[]

  })

  })

  //如果分解有内容就是懒加载走查询否则走的是修改

  如果(解决){

  解析(根孩子)

  }否则{

  nodeData.childNodes=[]

  nodedata。文档创建子项(根子项)

  }

  }否则{

  解析([])

  }

  })

  },

  //获取子节点请求

  getChildByList(nodeData,resolve) {

  var _parentID=nodeData.data.id

  const typeSpec={

  typeId: _parentID,

  pageIndex: 1,

  页面大小:100000

  }

  getAlltypeSpec(typeSpec).然后(res={

  const rootChildren=[]

  if (res.code===200) {

  const data=res.data.list

  data.map(item={

  rootChildren.push({

  名称:项目。描述,

  parentId: item.typeId,

  id: item.id,

  叶子:没错,

  儿童:[]

  })

  })

  如果(解决){

  解析(根孩子)

  }否则{

  nodeData.childNodes=[]

  nodedata。文档创建子项(根子项)

  }

  }否则{

  返回错误的

  }

  }).接住(错误={

  console.log(错误)

  })

  },

  //节点点击事件

  handleNodeClick(数据,节点){

  this.addnode=node

  this.adddata=data

  if (node.level===1) {

  这个。查询表单。typeid=节点。数据。编号

  this.queryForm.typeSpecId=

  } else if (node.level===2) {

  这个。查询表单。typeid=节点。数据。父编号

  这个。查询表单。typespecid=节点。数据。编号

  }

  this.query()

  },

  节点操作:增加节点修改节点删除节点(操作自己节点要传父节点信息才能找到自己当前节点,操作子节点就传当前节点结论:父节点操作子节点)

  //树节点增加类型规格

  appendNode(节点,数据){

  this.addTypesSpec={

  typeName: node.data.name,

  typeId: node.data.id

  }

  this.createTypesSpecDialog=true

  },

  //树类型修改

  编辑节点(节点,数据){

  const typeId=node.data.parentId

  //一级类型

  if (node.level===1) {

  this.editTypesDialog=true

  this.editTypes={

  id: node.data.id,

  typeName: node.data.name

  }

  }否则{

  this.editTypesSpecDialog=true

  this.getSelectTypes()

  //这个。edittypesspec=object。赋值({ },node.data)

  this.editTypesSpec={

  typeId: typeId,

  id: node.data.id,

  描述:节点。数据。名称

  }

  }

  },

  //树类型删除

  删除节点(节点,数据){

  //一级类型

  if (node.level===1) {

  这个. msgbox.confirm(此操作将删除资产类型数据,是否继续?, 删除提示, {

   confirmButtonText:确定,

  取消按钮文本: 取消,

  类型:"警告"

  }).然后(()={

  typeDel(node.data.id).然后(

  resp={

  这个. $消息(删除成功)

  this.query()

  this.loadNodeTree(node.parent)

  },

  错误={

  console.log(err ,err)

  }

  )

  }).catch(()={

  这个message.error(已取消)

  })

  }否则{

  这个. msgbox.confirm(此操作将删除资产类型规格数据,是否继续?, 删除提示, {

   confirmButtonText:确定,

  取消按钮文本: 取消,

  类型:"警告"

  }).然后(()={

  typeSpecDel(node.data.id).然后(

  resp={

  this.loadNodeTree(node.parent)

  这个。$message(“成功删除”)

  this.query()

  },

  错误={

  console.log(err ,err)

  }

  )

  }).catch(()={

  这个。$ message . error( canceled )

  })

  }

  },

  节点被触发后,会显示弹出框,经过正常的弹出框,增加修改和删除。但是后台请求提交后,返回操作成功,需要重新加载树形结构。所以这里再次调用load tree方法,触发并点击树就可以保存上传的节点。我的方法是handleNodeClick,不管是否点击修改、添加、删除,都保存被点击的节点。

  这个。$message(“编辑成功”)

  this . loadnodetree(this . add node . parent)

  1.设置膨胀和收缩

  如果(!node.expanded) {

  node . expand();

  }否则{

  node . collapse();

  }

  2.获取父节点

  节点.父节点

  如果能看懂,可以看看。代码是可以优化的,但是最近看不懂,这个逻辑你看得懂。下次见。

  关于Vue使用el-tree懒加载进行添加、删除和检查的这篇文章到此为止。关于Vue el-tree惰性加载的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望大家以后能多多支持我们!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: