广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >如何使用vue自定义指令构建拖放插件
  • 559
分享到

如何使用vue自定义指令构建拖放插件

2024-04-02 19:04:59 559人浏览 薄情痞子
摘要

我们都知道HTML5的拖放特性,利用它可以很方便的实现拖拽和放置功能,比如一些选择类操作的使用场景,让用户去拖拽比鼠标点击更容易接受和理解。今天我们就利用这一特性,结合Vue的自定义

我们都知道HTML5的拖放特性,利用它可以很方便的实现拖拽和放置功能,比如一些选择类操作的使用场景,让用户去拖拽比鼠标点击更容易接受和理解。今天我们就利用这一特性,结合Vue的自定义指令,来实现一个简单但是实用的拖放插件

为什么叫它插件?因为我们的目标不是开发一个vue组件,而是两个vue的自定义指令,并且最终会把这两个自定义指令封装到一个es6的class里,在实际项目中引入就可以很方便的使用了。

大部分的拖放使用场景都是把一些待选元素从A区域拖放到B区域。这里就涉及到两个概念,一个是可拖拽,一个是可放置,待选元素一定是可以被拖拽的,而目标区域(容器)一定是可以放置的。

如果我们开发一个可拖拽的vue组件,或者开发一个可放置的组件,那仅仅是这个组件可拖放,此时如果需求变更,又需要另外一个组件也支持拖放,那我们仍需要为另一个组件也编写拖放的代码。又或者其他项目也需要拖放功能了,我们也要重新开发。这样非常不利于维护和复用,而vue的自定义指令很好的帮我们解决了这个问题,我们只需要在组件(包括普通的dom元素)上添加自定义指令,就可以使这个组件(元素)可拖放,这样就可以灵活的去使用了。

除了核心功能默认内置的指令 (v-model 和 v-show),Vue 也允许注册自定义指令。注意,在 Vue2.0 中,代码复用和抽象的主要形式是组件。然而,有的情况下,你仍然需要对普通 DOM 元素进行底层操作,这时候就会用到自定义指令。

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

  • v-drag 使组件可拖拽
  • v-drop 使组件可放置

目标已经很明确了,那就开始动手吧!由于我们要让这两个指令可在任意组件上发挥作用,因此需要注册Vue全局指令。


Vue.directive('drag', {
   bind(el, binding, vnode){
        //只调用一次,指令第一次绑定到元素时调用。
        //在这里可以进行一次性的初始化设置。
    }
})
Vue.directive('drop', {
   bind(el, binding, vnode){
        //
    }
})

如果你的项目是vue-cli搭建的,你可以把这段代码写在main.js里vue初始化的上方。

我们先在drag指令的bind钩子里编写代码,bind只调用一次,并且是在指令第一次绑定到元素时调用,因此我们用了bind钩子。这个指令的目标是让组件(元素)可拖拽,所以我们设置el的draggable为true


el.draggable = true;
el.ondragstart = (event)=>{
  event.dataTransfer.setData("Text", "your data...");
}

当元素被拖拽时,会先触发ondragstart事件,通常我们都会在这个事件里为event的dataTransfer设置拖拽数据,目的是当元素被放置时,目标容器可以获取拖拽过来的数据,如果拖放不能传递数据,那将是没有意义的。上面的代码调用dataTransfer的setData方法设置拖拽数据,setData的参数1表示数据类型,参数2表示要传递的数据。

很不幸,拖拽数据目前仅支持字符串,如果你想传递复杂对象,可以将数据序列化

接下来我们为drop指令的bind钩子编写代码,这个指令的目的是让组件(元素)可放置,因此我们需要为元素的ondraGover(拖拽经过事件)、ondrop(放置事件)编写handler,这两个handler要阻止事件的默认行为。


el.ondragover = (event)=>{
  event.preventDefault(); //阻止默认行为
}
el.ondrop = (event)=>{
  event.preventDefault();
  let dragData = event.dataTransfer.getData('Text'); //获取拖拽数据
}

我们通过event.dataTransfer的getData方法可以获取到拖拽开始事件中设置的拖拽数据。

现在你就可以把这两个指令加到任何组件上了,加了v-drag的组件可以被拖动,加了v-drop的组件可以放置并接收拖拽数据。


<MyComponent v-drag></MyComponent>

<MyContainer v-drop></MyContainer>

新的问题来了,我们进行拖拽操作是为了传递数据,然而传递数据的开始阶段,我们是在自定义指令drag的bind钩子里进行的,传递数据的接收阶段,我们是在drop的bind钩子里进行的,那么,数据从哪儿来?到哪儿去?很显然,数据应该来自组件,也应该传递给另一个组件,否则我们把指令写到vue组件上就没有任何意义了。

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

接下来就很容易了,我们只需要为添加了v-drag的组件定义一个获取拖拽数据的接口,为添加了v-drop的组件定义一个接收拖拽数据的接口即可。虽然vue组件并不支持接口的定义,但我们可以约定好这两个方法名,在组件的method中进行实现即可。


//自定义组件内部
methods:{
  getDragData(){ //约定getDragData为获取组件拖拽数据的接口方法
    return this.id; //假设这个组件被拖拽时,需要将id传递出去
  }
  setDragData(data){ //约定setDragData为组件接收拖拽数据的接口方法
    this.appendNewChildById(data); //假设这个组件接收id来生成新元素
  }
}

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


let dragValue = "";
if(vnode.componentInstance.getDragData != undefined){
  dragValue = vnode.componentInstance.getDragData();
}
event.dataTransfer.setData("Text", dragValue);

v-drop指令中的ondrop事件


let dragValue = event.dataTransfer.getData('Text');
if(vnode.componentInstance.setDragData != undefined){
  vnode.componentInstance.setDragData(dragValue);
}

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

好啦,到这里我们已经完全实现了组件拖放的自定义指令,虽然很简单,但是很实用也很灵活,基本可以满足日常拖拽的需求,让我们总结一下整个流程吧!

  • 自定义全局指令 v-drag、v-drop
  • 需要拖拽的组件实现获取数据的接口方法
  • 需要放置的组件实现接收数据的接口方法
  • drag指令访问组件的接口方法获取数据
  • drop指令访问组件的接口方法传递数据

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

以上就是如何使用vue自定义指令构建拖放插件的详细内容,更多关于vue自定义指令构建拖放插件的资料请关注编程网其它相关文章!

--结束END--

本文标题: 如何使用vue自定义指令构建拖放插件

本文链接: https://www.lsjlt.com/news/124049.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何使用vue自定义指令构建拖放插件
    我们都知道html5的拖放特性,利用它可以很方便的实现拖拽和放置功能,比如一些选择类操作的使用场景,让用户去拖拽比鼠标点击更容易接受和理解。今天我们就利用这一特性,结合vue的自定义...
    99+
    2022-11-12
  • Vue如何自定义指令实现元素拖动
    这篇文章主要介绍了Vue如何自定义指令实现元素拖动的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Vue如何自定义指令实现元素拖动文章都会有所收获,下面我们一起来看看吧。一、自定义指令在使用自定义指令之前,先对自...
    99+
    2023-06-26
  • vue如何使用自定义指令
    这篇文章将为大家详细讲解有关vue如何使用自定义指令,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 使用自定义指令的逻辑与使用事件修饰符的逻辑...
    99+
    2022-10-19
  • Vue中如何使用自定义指令
    今天就跟大家聊聊有关Vue中如何使用自定义指令,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1.自定义指令的语法Vue自定义指令语法如下:Vue.d...
    99+
    2022-10-19
  • vue中的自定义指令如何使用
    这篇文章主要介绍“vue中的自定义指令如何使用”,在日常操作中,相信很多人在vue中的自定义指令如何使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”vue中的自定义指令如何使用”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-29
  • Vue+element自定义指令如何实现表格横向拖拽
    目录element自定义指令实现表格横向拖拽自定义指令设置及常用自定义指令指令定义函数提供了几个钩子函数(可选)下面分享几个实用的 Vue 自定义指令element自定义指令实现表格...
    99+
    2022-11-13
    Vue element 自定义指令 表格横向拖拽
  • Vue中在setup下如何使用自定义指令
    目录如何在setup下使用自定义指令1. 局部的自定义指令2. 全局注册自定义指令3. 简单的效果图4. 千万要注意如何在setup下使用自定义指令 1. 局部的自定义指令 html...
    99+
    2022-11-13
  • 在vue自定义组件中使用 v-model指令详情
    目录一、前言1.技术点提前知二、在自定义的vue组件中使用v-model1.效果演示图2.自定义组件代码示例3.在父组件使用自定义组件三、优写时刻一、前言 如何实现在自定义的vue组...
    99+
    2022-11-13
  • 如何在vue中使用过滤器和自定义指令
    本篇文章给大家分享的是有关如何在vue中使用过滤器和自定义指令,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。过滤器过滤器可以对我们传入的数据进行必要的处理,并返回处理的结果过滤...
    99+
    2023-06-15
  • 使用vue自定义如何实现Tree组件和拖拽功能
    目录vue自定义实现Tree组件和拖拽功能vue2 + js版vue2 + ts 版总结vue自定义实现Tree组件和拖拽功能 实现功能:树结构、右键菜单、拖拽 效果图 vue2 ...
    99+
    2022-12-09
    vue自定义Tree组件 vue Tree组件 vue拖拽功能
  • 如何使用maven自定义插件开发
    这篇文章主要介绍了如何使用maven自定义插件开发的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇如何使用maven自定义插件开发文章都会有所收获,下面我们一起来看看吧。Maven 插件的命名规范一般来说,我们会...
    99+
    2023-07-02
  • Vue3中的setup与自定义指令如何使用
    本篇内容主要讲解“Vue3中的setup与自定义指令如何使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue3中的setup与自定义指令如何使用”吧!setup语法糖最大好处就是所有声明部分...
    99+
    2023-07-06
  • Vue中如何实现自定义指令上报Google Analytics事件统计功能
    这篇文章将为大家详细讲解有关Vue中如何实现自定义指令上报Google Analytics事件统计功能,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。发现问题一般前端开发离...
    99+
    2022-10-19
  • 如何为记账系统添加自定义插件功能 - 使用PHP开发自定义插件的方法
    随着业务的发展和需求的多样化,很多企业和个人都选择使用记账系统来管理财务和记账工作。然而,随着时间的推移,记账系统的功能可能无法完全满足用户的需求,这就需要我们为记账系统添加自定义插件功能,以实现个性化定制和功能扩展。本文将介绍如何使用PH...
    99+
    2023-10-21
    自定义插件 PHP开发 记账系统
  • vue自定义组件如何通过v-model指令控制组件的隐藏、显示
    目录通过v-model指令控制组件的隐藏、显示1.新建一个叫child.vue的vue组件文件2.将这个组件注册在全局3.在父组件文件里面写入Child组件在组件中实现v-model...
    99+
    2022-11-13
  • 如何在Vue CLI中使用自定义组件
    在Vue.js框架下,使用自定义组件能够大大提高项目的开发效率。Vue CLI是一个基于Vue.js快速搭建项目的脚手架工具,Vue CLI的快速开发流程便于开发人员更快速地搭建项目。本篇文章将介绍如何在Vue CLI中使用自定义组件。一、...
    99+
    2023-05-14
  • 教你如何使用VUE组件创建SpreadJS自定义单元格
    SpreadJS纯前端表格控件是基于HTML5的Java电子表格和网格功能控件,适用于.NET、Java和移动端等各平台在线编辑类Excel功能的表格程序开发。 本文介绍了如何使用V...
    99+
    2022-11-12
  • vue如何使用process.env搭建自定义运行环境
    目录一、vue-cli项目下默认有三种模式二、可以通过环境文件来指定默认环境变量和自定义环境变量三、执行自定义环境文件,进入自定义环境四、配置举例和应用场景 vue-cli3总结一、...
    99+
    2023-01-10
    vue process.env process.env自定义运行环境 vue process.env搭建运行环境
  • vue自定义组件如何添加使用原生事件
    目录自定义组件如何添加使用原生事件. $emit()传递. native属性vue使用原生事件自定义组件如何添加使用原生事件 自定义组件(Components)是vue的重要知识块之...
    99+
    2022-11-13
  • vue如何使用hightcharts自定义图例点击事件
    这篇文章将为大家详细讲解有关vue如何使用hightcharts自定义图例点击事件,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。具体内容如下highcharts图表自带的图例点击事件是:点击某个显示/隐藏...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作