vue 树形图,vue递归树形结构

  vue 树形图,vue递归树形结构

  本文主要介绍vue实现可拖动的树形结构图,帮助大家更好的理解和学习使用vue框架。感兴趣的朋友可以了解一下。

  

目录

   vue递归组件拖动事件最近,vue做了一个小项目——可拖动的树形结构图。

  

Vue递归组件

  由结构Vue的递归组件实现

  使用layout flex,结构行由CSS伪类实现。

  要注意居中布局。当X轴上的元素过多时,子元素的宽度会超出视图。元素居中后,虽然有滚动条,但只能到达右边的内容,左边的内容将无法访问。可以将父元素设置为inline-flex,将宽度设置为auto。当然如果是上面的结构就不会有这个问题了,但是大数据渲染还是困扰了我一下午。

  

drag事件

  首先,将draggable属性绑定到需要拖动的元素。除了A和img标签默认设置为true,其他所有元素都需要设置。

  然后是三个事件,dragend,dragover和drop(用Vue写的,所以不要在事件前添加)

  注意dragover需要去掉默认行为,给事件赋予$event.preventDefault(),否则鼠标拖动时会被标记,使拖动无效。

  拖动的元素需要使用$ event . data transfer . setdata( node ,transnodedata)将值传输到放置位置。

   Node 是一个相当于传递数据的变量名,首先需要JSON.stringify()。

  方法:{

  dragstart(e,nodeObj){

  Console.log(拖动移动的点,nodeObj.name,);

  transdata=json . stringify(node obj)//先把传过来的数据拖成JSON格式。

  e.dataTransfer.setData(node ,transData)

  },

  dragover(e)

  预防默认()

  },

  drop(e,nodeObj){

  Console.log (point dropped to ,node obj . name);

  let get data=JSON . parse(e . data transfer . get data( node ))

  console . log( get data ,get data);

  }

  }

  了解了这一点,接下来要做的就是将获取的拖动点数据放入拖放点的子数组中,并在dragend事件中删除父节点的子数组中的拖动点。触发dragstart事件时获取节点的索引,通过eventBus的组件通信方式传递给dragend(也可以使用Vuex)。

  创建一个总线文件夹,并创建一个新的index.js文件。

  从“vue”导入Vue

  const busEvent=new Vue({

  data(){

  返回{

  DragNodeIndex:-1,//拖动父节点的子数组中节点的索引

  }

  },

  已创建(){

  这个。$on (TransdragNodeIndex ,RES={//要通过$on监控$emit,需要确保自定义事件在被触发之前被监控,即订阅先于发布,否则无法监控数据。没怎么用过eventBus,很坑。

  this.dragNodeIndex=res

  })

  }

  })

  导出默认业务事件

  将eventBus引入组件。此时,在dragstart中的$emit触发自定义事件后,$on就可以接收这些数据了。在dragend中,这个索引可以通过eventBus获取,然后在数组中删除。

  接下来就是做一些逻辑判断了。例如,父节点不能拖到子节点。首先,通过递归将父节点上所有子节点的名称遍历到一个数组中。如果放置位置的名称在数组中,则意味着父级已经到达子级。设置状态为真。

  Ifferdragtoson (dragobj,drop obj){//确定父节点是否已移动到子节点。

  if (dragObj.children.length===0)返回false

  设new arr=[];

  函数getAllName(dragObj) {

  newArr.push(.drag obj . children);

  if(drag obj . children . length===0){

  返回;

  }否则{

  for(设I=0;I drag obj . children . length;i ) {

  getAllName(drag obj . children[I]);

  }

  }

  }

  getAllName(drag obj);

  if (newArr.includes(dropObj)) {

  返回true

  }

  返回false

  }

  让dragend事件通过eventBus获取状态,如果为真则直接返回。

  不能拖到自己身上,退了就好。在扛锅的点下面专门加了一个子节点,主要是验证是通过栈中节点的地址来判断,而不是通过name属性来判断。

  还有一个就是要提到拖拽事件中的$event.dataTransfer.dropEffect。可以获得的值有移动、复制、无和链接。下图中,当dropEffect为时,拖动点消失,实际上意味着拖动事件中的代码被执行,而drop事件中的代码没有被执行,所以需要先控制这一步。另外,不同浏览器的默认dropEffect也不一样,比如360浏览器。

  代码连接

  以上是vue实现可拖动树形结构图的细节。更多关于vue实现树形结构图的信息,请关注我们的其他相关文章!

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

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