前端实现拖拽效果改变元素顺序

news/2025/1/11 12:45:41/

文章目录

  • 前言
  • 一、实现效果
  • 二、拖拽API
    • 1.代码
    • 2.遇见问题
  • 总结


前言

在一次工作中,前端要实现通过鼠标实现拖拽改变顺序的功能,之前没有接触过拖拽这一块所以刚开始一筹莫展,幸运的是在查阅学习中实现了前端拖拽功能。


一、实现效果

在这里插入图片描述

二、拖拽API

方法名详解
ondraggable设置元素是否允许被拖动。链接和图片默认是可拖动,因此不用设置该属性。
ondragstart用户开始拖动元素或选择的文本时触发。
ondragover拖动元素或选取的文本正在拖动到放置目标时触发。默认情况下,数据/元素不能放置到其他元素中。如果要实现改功能,我们需要防止元素的默认处理方法。我们可以通过调用 event.preventDefault()方法来实现 ondragover 事件。
ondragenter当被鼠标拖动的对象进入其容器范围内时触发此事件。
ondragend用户完成元素拖动后触发。

1.代码

1.1 html

<div :draggable="true"@dragstart="handleDragStart($event, element_detail)"@dragover="handleDragOver($event, element_detail)"@dragenter="Debounce(handleDragEnter($event, element_detail))"@dragend="handleDragEnd($event, element_detail)">
</div>

1.2 js

	const handleDragStart=(e,items)=>{// console.log('zxtdhandleDragStart',e,items)State.dragging = items//开始拖动时,暂时保存当前拖动的数据。}const handleDragEnd=(e,items)=>{// console.log('zxtdhandleDragEnd',e,items)console.debug(e,items)State.dragging = null//拖动结束后,清除数据}const handleDragOver=(e)=> {e.dataTransfer.dropEffect = 'move'//在dragenter中针对放置目标来设置!}const handleDragEnter=(e,items)=>{// console.log('zxtdhandleDragEnter',e,items)e.dataTransfer.effectAllowed = 'move'//为需要移动的元素设置dragstart事件if(items == State.dragging) returnlet newItems = [...State.previewDatas.productElementList]//拷贝一份数据进行交换操作。// console.log('newItems',newItems)let src//获取数组下标let dstnewItems.forEach((item,index)=>{// console.log('22222',item[0],index)if(item[0].id===State.dragging.id){src=index// console.log('lisrc',src)}if(item[0].id===items.id){dst=index// console.log('lidst',dst)}})// console.log('src,det',src,dst)newItems.splice(dst, 0, ...newItems.splice(src, 1))//交换位置State.previewDatas.productElementList = newItems}const Debounce= (fn, t)=>{const delay = t || 500let timerreturn function () {const args = argumentsif (timer) {clearTimeout(timer)}timer = setTimeout(() => {timer = nullfn.apply(this, args)}, delay)}}

2.遇见问题

在handleDragEnter()函数中,一定要根据实际情况匹配数据,网上有些获取数组元素下标是通过indexOf来获取的,例如:let arr=[{a:1},{a:2},{a:3}] arr.indexOf({a:1})=-1这种情况下都为-1。
在这里插入图片描述


总结

操作都是在handleDragEnter()这个函数中来实现的,所以并不难,只需要我们在这个函数中写js逻辑即可。


http://www.ppmy.cn/news/80618.html

相关文章

软件设计师 试题二做题技巧

问题一&#xff1a;去需求分析中找相应的联系类型 问题二先看缺少的属性是不是er图中的实体&#xff0c;如果是实体文中就会有相关的信息&#xff0c;如果没有就对应的去图中找&#xff0c;转化为关系模式对应的联系也要转化为关系模式 如果是一对一就把联系归并到任意一方实…

Ceph对象存储的基本概念、使用以及优点(基于nautilus版本)

Ceph对象存储的基本概念、使用以及优点&#xff08;基于nautilus版本&#xff09; Ceph是一个分布式对象存储系统&#xff0c;能够提供高性能、高可靠性和可扩展性。在Ceph中&#xff0c;数据被存储为对象&#xff0c;每个对象都有一个唯一的标识符&#xff0c;称为对象ID。对…

STL --- 2、容器 (1)Vector

目录 1、std::vector 的特点包括&#xff1a; 2、std::vector 常用的 API&#xff1a; 3、std::vector 使用的例子&#xff1a; 4、std::vector 的一些坑 5、std::vector 动态扩容机制 vector 是 C 标准库中的容器之一&#xff0c;它是一个动态数组&#xff0c;可以自动扩…

BFC与IFC

概念 块级元素在BFC布局&#xff08;块级格式化上下文&#xff09; 行内级元素在IFC布局&#xff08;行内级格式化上下文&#xff09; BFC 形成BFC的情况 BFC规则 在BFC中box在垂直方向排列在同一个BFC中&#xff0c;相邻box垂直方向外边距塌陷在BFC中box左边缘紧贴包含块的…

PCL学习之点云重建

1&#xff1a;点云模型重建 离散点云 • 数据量大 • 渲染显示大 • 模型操作计算不方便 网格模型 • 数据量小 • 渲染方便 • 模型操作计算方便 重建步骤 2&#xff1a;凸包算法 凸包 • 平面凸包&#xff1a;平面的一个子集S被称为是“ 凸”的&#xff0c;当且仅当对于任…

Unity之ShaderGraph节点介绍 Artistic艺术效果

前言 Artistic&#xff08;艺术效果&#xff09;  1、Adjustments&#xff08;图像调节&#xff09;   1) Chennel Mixer&#xff08;通道混合器&#xff09;   2) Contrast&#xff08;对比度&#xff09;   3) Hue&#xff08;色调偏移&#xff09;   4) Invert Co…

Selenium浏览器交互原理与应用,玩转Web自动化测试

目录 前言: 浏览器交互&#xff1a; Selenium的实现方式&#xff1a; Selenium WebDriver&#xff1a; WebDriver的等待机制: 总结&#xff1a; Web自动化测试&#xff1a; 前言: Web自动化测试是现代软件开发中必不可少的一个环节&#xff0c;它可以帮助开发人员快速自动…

ThingsBoard教程(五二):规则节点解析 AWS SNS Node, AWS SQS Node

AWS SNS Node Since TB Version 2.0 节点将消息发布到AWS SNS(亚马逊简单通知服务)。 配置: 主题ARN模式 - 可以直接设置消息发布的主题名称,也可以使用模式,该模式将使用消息元数据解析为实际的ARN主题名称。 AWS Access Key ID和AWS Secret Access Key是具有编程访问…