vue结合element-ui实现列表拖拽变化位置,点击拖动图标拖动整个列表元素,使用tsx格式编写

先来看下需要实现的效果

当鼠标放在左侧图标上时,可以拖动整个列表元素,调整顺序
在这里插入图片描述

思路介绍

使用draggable可以设置元素可拖动,然后分别设置三个事件处理函数,监听onDragstart、onDragover、onDragend三个事件
注意:如果在正常vue文件中,事件名为@dragstart、@dragover、@dragend

  • onDragstart函数中,获取当前拖拽的元素在数组中的索引并存储
  • onDragover中,判断当前元素超过了哪个元素,并存储此时所在位置的索引
  • onDragEnd中,根据刚才记录的索引对数组重新赋值

遇到的问题

由于要实现的功能是点击左侧的图标才可以拖动列表元素,但是draggable如果设置在整个列表元素,点击拖动哪里都可以,因此需要进行额外设置
新存储变量allowDrop,当鼠标点击左侧图标时,设置该变量为true,离开时设置为false
对于列表,当allowDrop为true时才允许拖动

模板部分代码

{
		  //注意这里是tsx格式
          this.itemData.length > 0 ? (
            ).map((item:sourceType, index:number) => (
            //在div上设置draggable并绑定处理函数
            //注意无法直接绑定在el-card上,会失效
              <div 
                draggable={this.allowDrop}
                onDragstart={() => this.handleStartDrag(index)}
                onDragover={() => this.handleCover(index)}
                onDragend={this.handleDragEnd}
              >
                <el-card
                  shadow="never"
                  body-style="padding: 10px;"
                >
                  <div class="left-icon" onMousedown={this.handleMouseDown} onMouseleave={this.handlMouseLeave}>
                    <i class="el-icon-s-operation"></i>
					自己的内容
                </el-card>
              </div>
            ))
          ) : '没有找到数据源'
        }

函数及变量部分代码

//存储数组数据
const itemData=ref([])

//记录当前拖拽的元素的索引
const curDragingIndex=ref()
//记录排序后的数据
let tempData:sourceType[]=[]

//开始拖拽,记录被拖拽的元素的索引
const handleStartDrag=(index:number)=>{
  curDragingIndex.value=index
}
//被覆盖
const handleCover=(index:number)=>{
  if((!curDragingIndex.value && curDragingIndex.value !== 0) || curDragingIndex.value === index){
    return;
  }
  const copyData = [...itemData.value];
  const deletedArr = copyData.splice(curDragingIndex.value, 1);
  copyData.splice(index, 0, ...deletedArr);
  tempData = copyData;
}
//拖拽结束,对数组进行重新赋值,即可实现位置变化
const handleDragEnd=()=>{
  curDragingIndex.value=null
  if(tempData.length){
    itemData.value=tempData
  }
}

//是否允许进行拖拽
const allowDrop=ref(false)
//处理鼠标事件
//当鼠标点击左侧图标时设置为true
const handleMouseDown=()=>{
  allowDrop.value=true
}
//鼠标离开时设置为false
const handlMouseLeave=()=>{
  allowDrop.value=false
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/885435.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

线性模型到神经网络

&#x1f680; 在初始神经网络那一节&#xff08;链接如下&#xff1a;初始神经网络&#xff09;的最后&#xff0c;我们通过加大考虑的天数使得我们最后得到的模型Loss最终停留在了0.32k&#xff0c;当我们在想让模型更加准确的时候&#xff0c;是做不到的&#xff0c;因为我们…

淘宝商品评论接口技术详解及代码示例

引言 淘宝商品评论接口是电商数据分析中不可或缺的一部分&#xff0c;它可以帮助商家和消费者更好地了解商品的质量、用户满意度等信息。本文将详细介绍如何使用淘宝商品评论接口&#xff0c;并提供相应的代码示例。 淘宝商品评论接口概述 淘宝商品评论接口主要用于获取商品…

【前端开发入门】前端开发环境配置

目录 引言一、Vscode编辑器安装1. 软件下载2. 软件安装3. 插件安装 二、Nodejs环境安装及版本控制1. 安装内容2. 使用nvm安装2.1 软件下载并安装2.2 nvm基本指令2.3 nvm下载过慢导致超时解决 三、git安装及配置1. 软件下载2. 软件安装3. 基础配置 四、总结 引言 本系列教程旨在…

【leetcode】122. 买卖股票的最佳时机 II

题目描述 给你一个整数数组 prices &#xff0c;其中 prices[i] 表示某支股票第 i 天的价格。 在每一天&#xff0c;你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买&#xff0c;然后在 同一天 出售。 返回 你能获得的 最大 利润 。…

【2025】基于Spring Boot的智慧农业小程序(源码+文档+调试+答疑)

文章目录 一、***-项目介绍二、***-开发环境三、***-系统展示四、***-代码展示五、***-项目文档展示六、***-项目总结 大家可以帮忙点赞、收藏、关注、评论啦 &#x1f447;&#x1f3fb; 一、***-项目介绍 当今社会已经步入了科学技术进步和经济社会快速发展的新时期&#x…

基于SpringBoot的网上租赁服务:设计与实现

第2章 关键技术简介 2.1 Java技术 Java是一种非常常用的编程语言&#xff0c;在全球编程语言排行版上总是前三。在方兴未艾的计算机技术发展历程中&#xff0c;Java的身影无处不在&#xff0c;并且拥有旺盛的生命力。Java的跨平台能力十分强大&#xff0c;只需一次编译&#xf…

深度学习后门攻击分析与实现(二)

前言 在本系列的第一部分中&#xff0c;我们已经掌握了深度学习中的后门攻击的特点以及基础的攻击方式&#xff0c;现在我们在第二部分中首先来学习深度学习后门攻击在传统网络空间安全中的应用。然后再来分析与实现一些颇具特点的深度学习后门攻击方式。 深度学习与网络空间…

解决 Android WebView 无法加载 H5 页面常见问题的实用指南

目录 1. WebView 简介 2. 常见问题 3. 网络权限设置 4. 启用 JavaScript 5. DOM Storage 的重要性 6. 处理 HTTPS 问题 7. 设置 WebViewClient 8. 调试工具 9. 其他调试技巧 10. 结论 相关推荐 1. WebView 简介 Android WebView 是一种视图组件&#xff0c;使得 And…

LiveGBS流媒体平台GB/T28181功能-支持电子放大拉框放大直播视频拉框放大录像视频流拉框放大电子放大

LiveGBS流媒体平台GB/T28181功能-支持电子放大拉框放大直播视频拉框放大录像视频流拉框放大电子放大 1、直播播放2、录像播放3、搭建GB28181视频直播平台 1、直播播放 国标设备-》查看通道-》播放 &#xff0c;左键单击可以拉取矩形框&#xff0c;放大选中的范围&#xff0c;释…

vue-element 表格组合查询 - fc-table-search 组件封装

开发目的 解决搜索form参数读取&#xff0c;配合异步请求&#xff0c;更新渲染数据&#xff1b;支持自适应高度&#xff0c;分页查询&#xff0c;搜索查询/重置。 额外提供formater类型&#xff1a;标签定义&#xff0c;金额&#xff0c;时间格式化&#xff0c;跨页勾选&#x…

uniapp/vue项目 import 导入文件时提示Module is not installed,‘@/views/xxx‘路径无法追踪

文章目录 背景解决方案1.IDE配置2.alias&#xff08;别名&#xff09;配置webpackvue-clivite 3.检查 jsconfig.json 或 tsconfig.json 写在最后 前往闪闪の小窝以获得更好的阅读和评论体验 背景 Vue3在我自学Vue的时候看过一点&#xff0c;实操过一点&#xff0c;但是太久没用…

基于php的酒店管理系

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…

动手学深度学习(李沐)PyTorch 第 3 章 线性神经网络

3.1 线性回归 线性回归是对n维输入的加权&#xff0c;外加偏差 线性回归可以看作是单层神经网络 回归问题中最常用的损失函数是平方误差函数。 平方误差可以定义为以下公式&#xff1a; 常数1/2不会带来本质的差别&#xff0c;但这样在形式上稍微简单一些 &#xff08;因为当…

实时语音交互,打造更加智能便捷的应用

随着人工智能和自然语言处理技术的进步&#xff0c;用户对智能化和便捷化应用的需求不断增加。语音交互技术以其直观的语音指令&#xff0c;革新了传统的手动输入方式&#xff0c;简化了用户操作&#xff0c;让应用变得更加易用和高效。 通过语音交互&#xff0c;用户可以在不…

Android入门

下载Android studio&#xff0c;创建第一个项目 模板可以选择empty views Activity 在这个界面可以修改&#xff0c;使用语言&#xff0c;项目名字&#xff0c;存储路径以及适用版本 完成后&#xff0c;得到一个最初始的Android 项目&#xff0c;红色标记的两个文件&#xf…

七星创客:重塑商业模式认知

近期&#xff0c;一个普遍存在的疑问困扰着许多人&#xff1a;“商业模式是否仅仅等同于拉人头或传销活动&#xff1f;”这样的联想或许源于对商业模式概念的片面理解&#xff0c;使得一些人错误地将所有商业模式都笼罩在负面阴影之下。 商业模式&#xff0c;这一商业领域的核心…

(IDEA)spring项目导入本地jar包方法和项目打包时找不到引入本地jar包的问题解决方案

系列文章目录 文章目录 系列文章目录一、&#xff08;IDEA&#xff09;spring项目导入本地jar包方法和项目打包时找不到引入本地jar包的问题解决方案1.资料 一、&#xff08;IDEA&#xff09;spring项目导入本地jar包方法和项目打包时找不到引入本地jar包的问题解决方案 1.资料…

Windows11系统下SkyWalking环境搭建教程

目录 前言SkyWalking简介SkyWalking下载Agent监控实现启动配置SkyWalking启动Java应用程序启动Elasticsearch安装总结 前言 本文为博主在项目环境搭建时记录的SkyWalking安装流程&#xff0c;希望对大家能够有所帮助&#xff0c;不足之处欢迎批评指正&#x1f91d;&#x1f91…

828华为云征文|华为云Flexus云服务器X实例部署 即时通讯IM聊天交友软件——高性能服务器实现120W并发连接

营运版的即时通讯IM聊天交友系统&#xff1a;特点可发红包&#xff0c;可添加多条链接到用户网站和应用&#xff0c;安卓苹果APPPC端H5四合一 后端开发语言&#xff1a;PHP&#xff0c; 前端开发语言&#xff1a;uniapp混合开发。 集安卓苹果APPPC端H5四合一APP源码&#xff0…

微信小程序——婚礼邀请函

目的 1.掌握微信小程序的开发技术&#xff0c;包括页面布局、交互设计、数据存储等。 2.学会运用微信小程序的各种组件和 API&#xff0c;实现个性化的婚礼邀请函功能。 3.通过制作婚礼邀请函小程序&#xff0c;提升创意设计和用户体验优化的能力。 4.了解如何在小程序中整…