VUE实现拖拽,vue拖拉拽生成组件

  VUE实现拖拽,vue拖拉拽生成组件

  这篇文章主要为大家详细介绍了某视频剪辑软件使用拖拽方式创建结构树,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  本文实例为大家分享了某视频剪辑软件使用拖拽方式创建结构树的具体代码,供大家参考,具体内容如下

  在页面中拖拽虚线框中的节点,创建向右的结构树,如下图

  记录实现思路:

  vueTree.vue

  模板

  div class=容器

  div class=节点容器

  div v-for=(item,index) in nodeList

  :key=index

   class=源节点

  draggable=true

  @dragstart=dragStart(item)

  {{ item }}

  /div

  /div

  div class=树容器

  @dragover=allowDrop

  @drop=handleDrop

  树节点v-if=nodeData

  ref=node

  :nodeData=nodeData

  @delete-node=deleteTree /

  /div

  /div

  /模板

  脚本

  从""导入TreeNode ./treeNode.vue

  从""导入{节点} ./config.js

  导出默认值{

  名称:“vue-tree”,

  组件:{

  TreeNode

  },

  //后代节点无法获取节点数据,即无法独立创建节点,所以将祖先节点的创建节点方法暴露给后代节点

  提供(){

  返回{

  创建节点:this.createNode

  }

  },

  data () {

  返回{

  nodeList: [0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9],

  currNode: null,

  节点数据:空

  }

  },

  方法:{

  //开始拖拽,获取节点数据

  拖拽开始(项目){

  this.currNode=item

  },

  //若未生成跟节点,则允许拖拽

  allowDrop(事件){

  如果(!this.nodeData) {

  事件。预防默认()

  }

  },

  //拖拽结束,生成节点

  handleDrop () {

  如果(!this.nodeData) {

  this.nodeData=this.createNode()

  }

  },

  createNode () {

  让节点=新节点(this.currNode)

  返回节点

  },

  //根节点删除,删除整个树

  deleteTree () {

  this.nodeData=null

  }

  }

  }

  /脚本

  样式lang=scss 范围。容器{

  填充:20px

  宽度:calc(100%-40px);

  高度:calc(100%-40px);节点容器{

  高度:100像素

  边框:1px虚线红色;

  显示器:flex。源节点{

  宽度:50px

  高度:30px

  背景:# fff

  边框:1px纯蓝;

  文本对齐:居中;

  行高:30px

  边距:10px

  光标:指针;

  }

  }。树容器{

  身高:calc(100%-122 px);

  边距-顶部:20px

  }

  }

  /风格

  配置,js

  导出类节点{

  构造者(姓名){

  this.name=name,

  this.children=[]

  }

  }

  树节点。某视频剪辑软件

  模板

  !-

  结构:最外层是节点内部,每个节点内部中有一个结节与节点盒、节点存放当前节点,节点盒存放当前节点的全部子节点,当前节点有几个子节点则节点盒中就会有几个节点内部,以此循环

  节点内部

  节点/节点

  节点盒

  节点内部

  节点/节点

  节点盒./节点框

  /节点内部

  节点内部

  节点/节点

  节点盒./节点框

  /节点内部

  .

  /节点框

  /节点内部

  -

  div class=node-inner

  div class=node

  :class= { drag-over-node :is dragover }

  @dragover=dragOver

  @dragleave=dragLeave

  @drop=nodeDrop

  span class= name"{ nodedata。name } }/span

  span class=del

  @click=deleteNode 删除/span

  /div

  div v-show= nodedata。孩子。长度0

   class=节点盒

  nodeData.children中的树节点v-for=(项目,索引

  :key=index

  :nodeData=item

  @ delete-node= delete child(index)/

  /div

  /div

  /模板

  脚本

  导出默认值{

  名称:"树节点",

  道具:{

  节点数据:{

  类型:对象,

  默认值:()={ }

  }

  },

  //获取祖先节点传递的数据

  注入:[createNode],

  data () {

  返回{

  isDragover: false

  }

  },

  方法:{

  //节点允许拖拽添加子节点

  拖拽(事件){

  事件。预防默认()

  如果(!this.isDragover) {

  this.isDragover=true

  }

  },

  dragLeave () {

  if (this.isDragover) {

  this.isDragover=false

  }

  },

  //为节点添加子节点

  nodeDrop () {

  let node=this.createNode()

  这个。nodedata。孩子。推送(节点)

  this.isDragover=false

  },

  //删除当前节点,本质是交给父级删除子节点

  deleteNode () {

  这个emit(delete-node )

  },

  //接收删除子节点的指令并执行删除功能

  deleteChild (index) {

  this.nodeData.children.splice(索引,1)

  }

  }

  }

  /脚本

  样式lang=scss 范围。节点{

  边框:1px纯色橙色;

  边框-半径:4px

  位置:相对;

  显示:内嵌-伸缩;

  对齐-项目:居中;

  justify-content:space-between;

  背景色:# fff

  高度:36px

  填充:0 12px 0 16px

  行高:36px

  边距-底部:10px。名称{

  字体大小:16px

  右边距:12px

  }。德尔{

  颜色:红色;

  字体大小:12px

  光标:指针;

  }。拖到节点上{

  盒影:6px 6px 12px rgba(106,20,134,0.15);

  }

  }。节点盒{

  显示:内嵌-伸缩;

  伸缩方向:列;节点-内部{

  左边距:80px

  //连接竖条

  :not(:last-child):before {

  位置:绝对;

  左:-70px;

  top:22px;

  边框:1px纯色橙色;

  内容:"";

  宽度:8px

  背景色:# fff

  边框-底部-颜色:# fff

  身高:100%;

  边框-顶部-颜色:# fff

  z指数:3;

  }

  //连接横条

  :在{

  左:-61px;

  宽度:60px

  内容:"";

  位置:绝对;

  top:14px;

  高度:8px

  边框:1px纯色橙色;

  内容:"";

  背景色:# fff

  边框-右边-颜色:# fff

  边框-左侧-颜色:# fff

  z指数:3;

  }

  //最后一个竖条圆滑拐角

  :第n-最后一个孩子(2):之前{

  边框-底部-左侧-半径:6px

  边框-底部-颜色:橙色;

  }

  //第一个横条拉长

  :第一个孩子:之后{

  左:-81px;

  宽度:80px

  z指数:2;

  }

  }

  }。节点-内部{

  位置:相对;

  }

  /风格

  以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

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

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