vue 实现拖拽插件,vue拖拽插件

  vue 实现拖拽插件,vue拖拽插件

  本文主要介绍如何使用vue自定义命令构建拖拽插件,帮助大家更好的理解和学习使用vue。感兴趣的朋友可以了解一下。

  我们都知道html5的拖拽特性,使用它可以轻松实现拖拽功能。比如,有些选择操作场景比鼠标点击更容易让用户接受和理解拖放。今天,我们将利用这一特性,结合vue的自定义指令,实现一个简单但实用的拖放插件。

  为什么叫外挂?因为我们的目标不是开发一个vue组件,而是开发两个vue的自定义指令,最终这两个自定义指令会封装成一个es6的类,在实际项目中很容易使用。

  大多数拖放场景都涉及到将一些要选择的元素从A区拖放到b区,这里涉及到两个概念,一个是可拖动的,另一个是可放置的。要选择的元素必须是可拖动的,目标区域(容器)必须是可放置的。

  如果我们开发一个拖放式的vue组件或者可放置组件,只是这个组件可以拖放而已。此时,如果需求发生变化,另一个组件需要支持拖放,我们仍然需要为另一个组件编写拖放代码。或者其他项目也需要拖拽功能,我们要重新开发。这不利于维护和重用,vue的自定义指令帮助我们解决了这个问题。我们只需要给组件(包括常用的dom元素)添加自定义指令,就可以让这个组件(元素)拖拽,这样就可以灵活使用了。

  除了核心功能的默认内置指令(v-model和v-show),Vue还允许注册自定义指令。注意,在Vue2.0中,代码重用和抽象的主要形式是组件。但是,在某些情况下,您仍然需要对普通DOM元素执行低级操作,然后您将使用自定义指令。

  综上所述,本文的目标需要完成两个自定义指令:

  垂直拖动允许拖动组件。

  V-drop允许放置元件。

  目标明确,那就开始吧!因为我们想让这两条指令在任何组件上工作,所以我们需要注册Vue全局指令。

  Vue.directive(drag ,{

  bind(el,binding,vnode){

  //当指令第一次绑定到元素时,只调用一次。

  //这里可以进行一次初始化。

  }

  })

  Vue.directive(drop ,{

  bind(el,binding,vnode){

  //

  }

  })

  如果您的项目是由vue-cli构建的,您可以在main.js中的vue初始化的顶部编写此代码

  首先,我们在拖动指令的绑定钩子中编写代码。bind只调用一次,当指令第一次绑定到一个元素时调用,所以我们使用bind钩子。这条指令的目标是使组件(元素)可拖动,所以我们将el的drag设置为true。

  el.draggable=true

  el.ondragstart=(event)={

  event . data transfer . setdata( Text ,您的数据.);

  }

  拖动元素时,首先会触发ondragstart事件。通常,我们在这个事件中为事件的dataTransfer设置拖动数据,这样当元素被放置时,目标容器就可以获得拖动的数据。如果拖放不能传输数据,那就没有意义了。上面的代码调用dataTransfer的setData方法来设置拖动数据。setData的参数1表示数据类型,参数2表示要传输的数据。

  遗憾的是,拖动数据目前只支持字符串。如果要传递复杂的对象,可以序列化数据。

  接下来,我们为drop指令的绑定钩子编写代码。这条指令的目的是使组件(元素)可放置,所以我们需要为元素的ondragover(拖动事件)和ondrop(放置事件)编写处理程序。这两个处理程序想要阻止事件的默认行为。

  el.ondragover=(event)={

  event . prevent default();//阻止默认行为

  }

  el.ondrop=(event)={

  event . prevent default();

  let dragData=event . data transfer . get data( Text );//获取拖动数据

  }

  我们可以通过event.dataTransfer的getData方法获取拖放开始事件中的拖放数据集

  现在您可以将这两条指令添加到任何组件中。带有v形拖动的组件可以被拖动,带有v形放下的组件可以放置和接收拖动数据。

  我的组件v型阻力/我的组件

  我的容器垂直下降/我的容器

  新的问题来了。我们通过拖放来传输数据。但是,在数据传输的初始阶段,我们在自定义命令drag的bind hook中进行,在接收阶段,我们在drop的bind hook中进行。那么,数据从何而来?去哪里?很明显,数据应该来自一个组件,然后传递给另一个组件,否则我们给vue组件写指令就没有意义了。

  幸运的是,自定义指令的钩子函数为我们提供了最简单有效的访问组件的方法:那就是钩子函数的第三个参数vnode。vnode的一个属性是componentInstance,这个componentInstance就是自定义指令的宿主:vue组件实例!

  接下来,就简单了。我们只需要定义一个接口来获取添加了v-drag的组件的拖动数据,并定义一个接口来接收添加了v-drop的组件的拖动数据。虽然vue组件不支持接口的定义,但是我们可以在这两个方法的名称上达成一致,并在组件的方法中实现。

  //自定义组件的内部

  方法:{

  GetDragData(){//Contract GetDragData作为接口方法获取组件的拖动数据。

  返回this.id//假设拖动这个组件时,需要传出id

  }

  SetDragData(data){ //收缩组件接收拖动数据的SetDragData的接口方法。

  this.appendNewChildById(数据);//假设这个组件接收到id来生成一个新元素

  }

  }

  然后重写我们的自定义指令设置和传递拖放数据的代码:

  设drag value=“”;

  if(vnode . component instance . getdragdata!=未定义){

  drag value=vnode . component instance . getdragdata();

  }

  event . data transfer . setdata( Text ,drag value);

  垂直下降指令中的Ondrop事件

  let drag value=event . data transfer . get data( Text );

  if(vnode . component instance . setdragdata!=未定义){

  vnode . component instance . setdragdata(drag value);

  }

  我们在访问组件的接口方法时添加if判断,因为如果没有接口的约束,组件可能无法实现这些方法。

  好了,到目前为止,我们已经完全实现了组件拖拽的自定义命令。虽然很简单,但是非常实用灵活,基本可以满足日常拖拽的需求。我们来总结一下整个过程吧!

  全局命令垂直拖动、垂直放下

  被拖动的组件实现获取数据的接口方法。

  所需的组件实现接收数据的接口方法。

  拖动指令访问组件的接口方法来获取数据。

  指示删除访问组件的接口方法来传输数据。

  我们将全局自定义指令的相关代码封装到es6的一个类中,作为单独的js文件放入项目中,或者发布到npm中,然后在main.js中导入这个类,调用静态初始化方法,完成全局指令的注册。这样,项目中的任何组件都可以使用v-drag和v-drop。上面总结的五个步骤只需要在第2条和第3条中执行。

  这就是如何使用vue自定义指令构建拖放插件的细节。更多关于vue自定义指令构建拖拽插件的信息,请关注我们的其他相关文章!

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

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