vue拖拽实现

2023-10-27

拖拽介绍:
在这里插入图片描述
目标是将左侧list中的item拖入右侧card中,如下所示:(将list1和list3拖入右侧拖拽区)
将list1和list3拖入右侧拖拽区

一、拖拽样式实现

使用vue + vuetifyjs实现。页面布局可根据不同的UI库自行修改。
html内容:

<template>
    <div>
        <h1 class="title">欢迎来到小余的梦幻王国~</h1>
        <div class="d-flex  justify-center ">
            <v-card
                class="mx-auto"
                width="500"
            >
                <v-list dense>
                    <v-subheader>拖拽实现插入</v-subheader>
                    <v-list-item-group
                        v-model="selectedItem"
                        color="primary"
                    >
                        <v-list-item
                            v-for="(item, i) in list"
                            :key="i" 
                        >
                            <v-list-item-title v-text="item"></v-list-item-title>
                        </v-list-item>
                    </v-list-item-group>
                </v-list>
            </v-card>
            <v-card
                id="target"
                width="500"
            >
                我是card
                <div v-for="(item,i) in drapItem" :key="i">{{item}}</div>
            </v-card>
        </div>

    </div>
</template>

js部分:

<script>
    export default {
        data() {
            return {
                list: ['list1', 'list2', 'list3', 'list4'],
                selectedItem: 0,
                drapItem: [],
            };
        },
    };
</script>

二、拖拽事件

2.1 使元素可被拖拽

在要拖拽的元素上加入draggable="true"属性

<v-list-item
  v-for="(item, i) in list"
  :key="i"
  draggable="true"
>
  <v-list-item-title v-text="item"></v-list-item-title>
</v-list-item>

2.2 拖拽事件介绍

  • @dragstart:拖拽开始事件,可绑定于被拖拽元素上(拖拽源);
  • @dragend:拖拽结束事件,可绑定于被拖拽元素上(拖拽源);
  • @dragover:拖拽持续移动事件,建议绑定于可拖放区域(右侧拖拽区);
  • @dragenter:进入拖放区域,建议绑定于可拖放区域(右侧拖拽区),该事件仅在进入拖放区域时触发,在其内部移动时不触发,离开某一可拖放区域后再进入时会再次触发;

ondrop事件:
拖放事件,绑定于可拖放区域上。

<div
  id="target"
  width="500"
  @drop="targetDrop"
>
  目标拖拽区
</div>

然而当我们将可拖拽元素拖放至此时,并没有触发事件。
根据 MDN 的文档:

A listener for the dragenter and dragover events are used to indicate valid drop targets, that is, places where dragged items may be dropped. Most areas of a web page or application are not valid places to drop data. Thus, the default handling for these events is to not allow a drop.", hence the only way for the drop event to be fired is to first cancel the dragenter or dragover event.

我们必须阻止某一 DOM 元素对 dragover 的默认行为,才能使 drop 事件在其上正确执行。

<div class="drop-field"
     @drop="drop"
     @dragover.prevent
>
    ...
</div>

2.3 DataTransfer (传递消息)

DataTransfer 对象用于保存拖动并放下(drag and drop)过程中的数据。它可以保存一项或多项数据,这些数据项可以是一种或者多种数据类型。关于拖放的更多信息,请参见 Drag and Drop.

这个对象可以从所有拖动事件 drag eventsdataTransfer 属性上获取。

2.3.1 DataTransfer 标准方法:

  • DataTransfer.clearData()

    删除与给定类型关联的数据。类型参数是可选的。如果类型为空或未指定,则删除与所有类型关联的数据。如果指定类型的数据不存在,或者 data transfer 中不包含任何数据,则该方法不会产生任何效果。

  • DataTransfer.getData()

    检索给定类型的数据,如果该类型的数据不存在或 data transfer不包含数据,则返回空字符串。

  • DataTransfer.setData()

    设置给定类型的数据。如果该类型的数据不存在,则将其添加到末尾,以便类型列表中的最后一项将是新的格式。如果该类型的数据已经存在,则在相同位置替换现有数据。

  • DataTransfer.setDragImage()

    用于设置自定义的拖动图像。

2.3.2 DataTransfer.setData 传递消息和传参

具体使用方法如下所示:

<v-list-item
  v-for="(item, i) in list"
   :key="i"
   draggable="true"
   @dragstart="dragstart($event, item,i)"
>
   <v-list-item-title v-text="item"></v-list-item-title>
</v-list-item>
dragstart(e, item, index) {
// 参数e为DragEvent事件
  e.dataTransfer.setData('item', item);
  e.dataTransfer.setData('index', index);
},

2.3.3 在拖放区的 drop 事件中获取消息

<v-card
    id="target"
    width="500"
    @dragover.prevent
    @drop="targetDrop"
>
    我是card
    <div v-for="(item,i) in drapItem" :key="i">{{item}}</div>
</v-card>
targetDrop(e) {
   const index = e.dataTransfer.getData('index');
   // 增加数据
   this.drapItem.push(e.dataTransfer.getData('item'));
   // 删除原数据
   this.list.splice(index, 1);
},

2.3.4 在拖拽对象(源)的 dragend 事件中清除消息

但其实清不清除事件好像都一样。。。

<v-list-item
    v-for="(item, i) in list"
    :key="i"
    draggable="true"
    @dragstart="dragstart($event, item,i)"
    @dragend="dragend"
>
    <v-list-item-title v-text="item"></v-list-item-title>
</v-list-item>
dragend(event) {
   event.dataTransfer.clearData();
},

拖拽实现整体思路如下:
在这里插入图片描述
参考:
1.https://segmentfault.com/a/1190000013606983 作者是“dailybird”的文章。
2.mdn中的DataTransfer文章

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue拖拽实现 的相关文章

随机推荐

  • python字符串与数字类型转换

    str与int i 10 s str i s 10 s 1 i int s i 1 str与float st 4 t float st t 0 4 st 0 4 t float st t 0 4 t 0 4 st str t st 0 4
  • libevent (一) socket属性设置与初始化操作

    socket属性设置与初始化操作 libevent是一个事件触发的网络库 适用于windows linux bsd等多种平台 内部使用select epoll kqueue等系统调用管理事件机制 著名分布式缓存软件memcached也是li
  • 小程序怎么搭建?学会这些技巧,开启创业之路

    随着移动互联网的发展 小程序成为了一种重要的创业工具 小程序具有开发周期短 运营成本低 用户体验好等特点 被越来越多的企业和个人用来实现商业价值 本文将通过一个案例来介绍小程序的搭建技巧 帮助创业者更好地开启创业之路 案例介绍 某家生鲜电商
  • CentOS下安装配置Phabricator

    1 下载快捷安装sh http download csdn net detail u012547633 9882697 把centos版的phabricator安装脚本下载到opt目录并安装 cd opt chmod 777 install
  • java版本号分段比较_版本号判断,例如:1.0.0比较1.0.1

    有的时候可能会判断客户端的版本号信息 多位数的版本号判断做个记录 代码分享者 zzp 注意 Java中应该吧分割的正则使用 来分割小数点字符串 分割 NSArray curVerArr currentVersion componentsSe
  • 了解Chat GPT

    CHATGPT是一款强大的人工智能语言模型 可以回答任何问题和开启有趣的对话 以下是一些使用CHATGPT的技巧和提示 提问明确 CHATGPT能够回答任何问题 但它需要清晰和明确的问题来给出准确的答案 因此 在提问时要尽可能明确和具体 尝
  • 【JDBC】-- Java连接数据库方法(Mysql8+idea)

    Java Database Connectivity 简称JDBC 是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口 提供了诸如查询和更新数据库中数据的方法 Java如何连接数据库 下面使用Mysql8版本 编译器使用ide
  • Flink_CDC搭建及简单使用

    Flink CDC搭建及简单使用 1 CDC简介 CDC Change Data Capture 在广义的概念上 只要能捕获数据变更的技术 都可以称为 CDC 但通常我们说的CDC 技术主要面向数据库 包括常见的mysql Oracle M
  • Dubbo-admin 新版本启动问题记录

    Dubbo admin 新版本启动问题记录 文章目录 Dubbo admin 新版本启动问题记录 1 安装步骤 a 下载zookeeper b 下载并编译dubbo 2 总结 1 安装步骤 直接按照官网下载下来的软件 并按照说明安装软件会存
  • Vagrant虚拟机安装,磁盘扩容以及局域网内访问教程

    1 下载vagrant以及virtualBox 配上vagrant virtualBox线上下载地址 vagrant下载地址 virtualBox下载地址 2 开始准备安装镜像文件 找到需要安装的系统镜像文件 配上vagrant镜像地址 v
  • Linux strace 命令 说明

    Strace是Linux中一个调试和跟踪工具 它可以接管被跟踪进程执行的系统调用和收到的信号 然后把每一个执行的系统调用的名字 参数和返回值打印出来 可以通过strace找到问题出现在user层还是kernel层 strace 显示这些调用
  • 集群基础3——haproxy负载均衡apache

    文章目录 一 环境说明 二 安装配置httpd 三 安装配置haproxy 四 验证http负载均衡 五 配置https负载均衡 六 haproxy网页监控 6 1 监控参数详解 6 2 页面操作 一 环境说明 使用haproxy对apac
  • jmeter中body data使用post请求的json格式提交

    之前介绍过jmeter中post的默认提交形式form表达提交 Content type application x www form urlencoded 使用直接 填写参数的形式 本次介绍的是jmeter中body data使用也就是j
  • 学历和工作年限决定了程序员的工资水平吗?

    根据中国互联网络信息中心 CNNIC 近日发布的第 45 次 中国互联网络发展状况统计报告 可知 截至 2020 年 03 月 中国网民规模为 9 04 亿 较 2018 年底增加 7508 万 其中农村网民规模达 2 55 亿 占网民整体
  • 时序预测

    时序预测 MATLAB实现SVM 支持向量机 时间序列多步预测 目录 时序预测 MATLAB实现SVM 支持向量机 时间序列多步预测 预测效果 模型描述 程序设计 学习总结 参考资料 预测效果 模型描述 Options 可用的选项即表示的涵
  • maven环境快速搭建

    最近 开发中要用到maven 所以对maven进行了简单的学习 因为有个maven高手在身边 所以 很快就上手了 我这里算是自我总结吧 关于maven是什么东东 请参考其它文章 准备工作 Jdk 1 5以上java开发环境 Eclipse
  • 图解TCP/IP

    第1章 网络基础知识 本章总结了深入理解TCP IP所必备的基础知识 其中包括计算机与网络发展的历史及其标准化过程 OSI参考模型 网络概念的本质 网络构建的设备等 1 5 4 OSI参考模型中各个分层的作用 应用层 为应用程序提供服务并规
  • Python爬虫入门6:模拟浏览器访问网页的http报文体压缩传输

    前往老猿Python博客 https blog csdn net LaoYuanPython 一 引言 在前面章节中介绍了使用urllib包的request模块访问网页的方法 但上节特别说明http报文头Accept Encoding最好不
  • pytorch和tensorflow有什么区别?

    PyTorch 是一种用于构建深度学习模型的功能完备框架 同时tensorflow也是常用的框架之一 大家在学习的时候 尝尝会用来做比较 那么pytorch和tensorflow有什么区别 大家所关心的问题 解答来了 pytorch和ten
  • vue拖拽实现

    拖拽介绍 目标是将左侧list中的item拖入右侧card中 如下所示 将list1和list3拖入右侧拖拽区 一 拖拽样式实现 使用vue vuetifyjs实现 页面布局可根据不同的UI库自行修改 html内容