关于拖拽功能

news2024/11/18 1:28:04

写在前面

提及拖拽,我们去实践的时候,总是想要依赖第三方工具,有些场景下第三方拖拽库确实方便;有些场景使用第三方拖拽库反而复杂化了

自己手动实现拖拽的demo

提示:可以看下打印信息,知道了拖拽主体(被拖拽)A数据信息,又知道的要放在位置B数据的信息,操作一下数据,视图自然就更新了

需要补一些课:

  1. preventDefault是个什么东西?别一上来就是阻止默认事件,什么是默认事件?
  2. dataTransfer是什么?
<template>
  <div class="container">
    <div class="config-left">
      <div
        v-for="item in floorConfigListShow"
        :key="item.id"
      >
        <div
          class="content"
          @drop="onUsedDrop($event, item)"
          @dragover="allowDrop($event)"
        >
          <div
            class="item"
            draggable="true"
            @dragstart="onUsedDragStart($event, item)"
          >
            
          </div>     
        </div>
      </div>
    </div>

    <div class="config-right">
      <div
        @drop="onUnusedDrop($event)"
        @dragover="allowDrop($event)"
      >
        <div
          class="item"
          draggable="true"
          v-for="item in showUnusedButtons"
          :key="item.id"
          @dragstart="onUnusedDragStart($event, item)"
        >
          {{ item.id }}
        </div>
           
      </div>
    </div>
  </div>
  
</template>

<script>

export default {
  name: "ElevatorConfigPanel",
  components: {
    
  },
  data() {
    return {
      floorConfigListShow: [{id: 1, name: "A"}, {id: 2, name: 'B'}],
      showUnusedButtons: [{id: 1}, {id: 2}]
    };
  },
  methods: {
    /**
     * 阻止默认方式,否则是无法移动元素的
     * 默认是无法将元素放到其他元素上。
     */
    allowDrop(e) {
      e.preventDefault();
    },
    /**
     * 开始拖拽
     */
    onUsedDragStart(e, info) {
      console.log('已配置区域的拖拽', e);
      e.dataTransfer.setData('info', JSON.stringify(info));
    },
    /**
     * 左侧drop事件
     */
    onUsedDrop(e, item) {
      e.preventDefault();
      let info = JSON.parse(e.dataTransfer.getData('info'));
      console.log("info", info);
      console.log("floor", item);
    },
    /**
     * 右侧开始拖拽
     * @param {*} e
     * @param {*} info
     */
    onUnusedDragStart(e, info) {
      e.dataTransfer.setData('info', JSON.stringify(info));
    },
    /**
     * 右侧drop事件事件
     */
    onUnusedDrop(e) {
      e.preventDefault();
      let info = JSON.parse(e.dataTransfer.getData('info'));
      console.log('右侧drop时间', info);
    }
   
  }
};
</script>

<style lang="less" scoped>
.container {
  display: flex;
  margin-left: 100px;
  padding: 10px;
  width: 700px;
  height: 500px;
  border: 1px dashed red;
  .config-left {
    width: 50%;
    height: 100%;
    border: 1px dashed yellow;
    .content {
      width: 100px;
      height: 100px;
      .item {
        width: 100%;
        height: 100%;
        text-align:center;
        border: 1px solid white;
      }
    }
  }
  .config-right {
    width: 50%;
    height: 100%;
    border: 1px dashed blue;
    .item {
        width: 100px;
        height: 100px;
        text-align:center;
        border: 1px solid white;
      }
  }
}
</style>

在这里插入图片描述
右边移动到左边:
在这里插入图片描述

左边移动到右边:
在这里插入图片描述

例如:
在语言模型中,编码器和解码器都是由一个个的 Transformer 组件拼接在一起形成的。

提示:这里可以添加技术名词解释

例如:

  • Bert
  • GPT 初代
  • GPT-2
  • GPT-3
  • ChatGPT

技术细节:Js中拖拽(拉)事件(drag 和 drop)

HTML5专门提供了拖拽功能,刀耕火种的岁月里据说用的是mouseover等事件(我没去了解,说新的)

浏览器兼容性

链接放这里,后面看到这篇文章可以去看看最新的支持情况
在这里插入图片描述

拖拽Api的介绍

拖拽流程

可以拖动dom在浏览器中进行移动。
过程叙述:用户可使用鼠标选择可拖拽(draggable)元素,将元素拖拽到可放置(droppable)元素,并释放鼠标按钮以放置这些元素。拖拽操作期间,会有一个可拖拽元素的半透明快照跟随着鼠标指针

1.dragstart事件

dragstart类似于鼠标按下事件:当元素开始被拖拽的时候触发的事件
作用于:被拖拽的元素

2.dragenter事件

dragenter类似于鼠标进入元素的事件:当拖拽的元素进入目标元素的上方时,触发的事件
作用于:目标元素

3.dragover事件

dragover类似于鼠标在某元素上的事件:拖拽元素在目标元素上移动的时候触发的事件
作用于:目标元素

4.drop事件(必须要dragover事件触发)

drop类似于鼠标松开的事件:被拖拽的元素在目标元素上,鼠标放开触发的事件
作用于:目标元素

5.dragend事件

类似于鼠标松开的事件:当拖拽完成后触发的事件
作用于:被拖拽的元素

MDN关于拖拽的解析

链接: MDN关于拖拽的解析

相关属性

1.draggable(让元素可拖拽)

draggable解释说明:

draggable用于标识元素是否允许使用 拖放操作 API (en-US) 拖动。
draggable的取值如下:
true,表示元素可以被拖动 ;
false,表示元素不可以被拖动 ;
如果该属性没有设值,则默认值 为 auto,表示使用浏览器定义的默认行为。

dataTransfer(对应的拖拽媒介)

拖拽拽对象用来传递的媒介(存储被拖拽元素的数据信息或其他信息),使用一般为Event.dataTransfer

1.DataTransfer.clearData()

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

2.DataTransfer.getData()

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

3.DataTransfer.setData()

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

// 在event事件对象上调用 dataTransfer 通过 setData(名称1,值1)
// 进行传递数据,通过 getData(名称1) 获取值;类似于sessionStorage(本地存储)
event.dataTransfer.setData('drag_text',event.target.innerHTML) 
4.DataTransfer.setDragImage()

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

preventDefault(阻止默认事件)

不可以将一个元素放到另一个元素上面就是默认事件---->阻止默认事件,就是让这一操作可以正常进行

在这里的主要作用是,在dragstart这个事件的时候,不能使用 preventDefault 阻止默认事件, 使用了preventDefault的后果就是,不能进行拖拽!!!!!!!!

Event.effectAllowed (拖拽的效果)

拖拽效果的一个设置

第三方拖拽库

VueGridLayout

链接: link

import VueGridLayout from 'vue-grid-layout'; 

 components: {
    GridLayout: VueGridLayout.GridLayout,
    GridItem: VueGridLayout.GridItem
  }
  <grid-layout
                :layout.sync="layout"
                :col-num="12"
                :row-height="36"
                :margin="[0, 0]"
                :is-draggable="draggable"
                :is-resizable="resizable"
                :is-bounded="bounded"
                :vertical-compact="true"
                :use-css-transforms="true"
                @layout-updated="layoutUpdatedEvent"
              >
                <grid-item
                  v-for="item in layout"
                  :static="item.static"
                  :x="item.x"
                  :y="item.y"
                  :w="item.w"
                  :h="item.h"
                  :i="item.i"
                  :key="item.i"
                  drag-allow-from=".vue-draggable-handle"
                >
                 
                </grid-item>
              </grid-layout>



   layout:[
       {"x": 0, "y": 1, "w": 12, "h": 1, "i": "0", static: false},
        {"x": 0, "y": 0, "w": 12, "h": 1, "i": "1", static: false},
        {"x": 0, "y": 2, "w": 12, "h": 1, "i": "2", static: false},
        {"x": 0, "y": 3, "w": 12, "h": 1, "i": "3", static: false}
      ]

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

独立游戏《星尘异变》UE5 C++程序开发日志2——创建并编写一个C++类

在本篇日志中&#xff0c;我们将要用一个C类来实现一个游戏内的物品&#xff0c;同时介绍UCLASS、USTRUCT、UPROPERTY的使用 一、创建一个C类 我们在UE5的"内容侧滑菜单"中&#xff0c;在右侧空白中右键选择"新建C类"&#xff0c;然后可以选择一个想要的…

GEE代码条带问题——sentinel-1接缝处理的问题

问题 我有兴趣确定 NDVI 损失最大的年份。我创建了一个函数来收集所有陆地卫星图像并应用预处理。当我导出结果以识别 NDVI 损失最大年份时&#xff0c;生成的数据产品与陆地卫星场景足迹有可怕的接缝线。造成这种情况的原因是什么以及如何调整代码&#xff1f; sentinel1数据…

大模型基础应用框架(ReACT\SFT\RAG)创新及零售业务落地

如何将大语言模型的强大能力融入实际业务、产生业务价值&#xff0c;是现在很多公司关注的焦点。在零售场&#xff0c;大模型应用也面临很多挑战。本文分享了京东零售技数中心推出融合Agent、SFT与RAG的大模型基础应用框架&#xff0c;帮助业务完成大模型微调、部署和应用&…

华为数通方向HCIP-DataCom H12-821题库(多选题:61-80)

第61题 ACL 可分为如下哪些类别? A.用户自定义 ACL B.基本 ACL C.二层ACL D.高级ACL 【参考答案】ABCD 【答案解析】 A. 用户自定义 ACL (User-defined ACL): 这是用户根据自身需求自定义的 ACL,用于实现特定的访问控制策略。B.基本 ACL (Standard ACL): 基本 ACL 是基于源 …

逆向案例四、进阶,爬取精灵数据咨询前五十页数据

python代码示例: import csv import execjs import requests f open(精灵数据.csv,w,encodingutf-8,newline) csv_writer csv.DictWriter(f,fieldnames[标题,发布时间,新闻来源,详情页链接,转自,点击量,新闻作者,发布时间小时,]) csv_writer.writeheader() data [] for pa…

HTTP/2、HTTP/3分别解决了什么问题

总的来说就是HTTP/1.1是请求-响应模型导致队头阻塞问题&#xff0c;HTTP2是TCP层面导致队头阻塞问题 HTTP/2 多路复用&#xff0c;解决了HTTP/1.1队头阻塞问题 HTTP/1.1 的实现是基于请求-响应模型的。同一个连接中&#xff0c;HTTP 完成一个事务&#xff08;请求与响应&…

【 10X summary report】怎么看?详细解读笔记

报告内容 在开始正式的分析之前&#xff0c;需要查看在对齐和计数过程中生成的任何总结统计信息。下图是由Cell Ranger工具创建的10X总结报告&#xff0c;在从10X scRNA-seq实验生成计数矩阵时会生成。 The left half of the report describes sequencing and mapping statist…

php开发项目 docx,pptx,excel表格上传阿里云,腾讯云存储后截取第一页生成缩略图

服务器或者存储上传的word,ppt和excel表格需要截取内容展示的时候,就需要管理后台每次上传文件时根据不同文件类型截取图片保存起来,并讲图片的地址保存到数据字段中.网上搜索了很多相关文章遇到的坑不少,经过2天时间终于完成了,将代码和遇到的问题完整记录下来. 本文用的…

基于SpringBoot+MYSQL的医护人员排班系统

基于springboot的医护人员排班系统录像 1、 前言介绍 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了医护人员排班系统的开发全过程。通过分析医护人员排班系统管理的不足&#xff0c;创建了一个计算机管理医护人员…

贪心 Leetcode 134 加油站

加油站 Leetcode 134 学习记录自代码随想录 在一条环路上有 n 个加油站&#xff0c;其中第 i 个加油站有汽油 gas[i] 升 你有一辆油箱容量无限的的汽车&#xff0c;从第 i 个加油站开往第 i1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发&#xff0c;开始时油…

企业内部培训考试系统题库导入功能设计

企业内部培训考试系统可自建题库&#xff0c;企业可以将已有的试题资源快速导入系统&#xff0c;系统具备智能选题功能&#xff0c;可以根据预设条件自动从题库中抽取试题&#xff0c;生成试卷&#xff0c;可以充分利用已有的教育资源&#xff0c;避免重复劳动&#xff0c;提高…

sc-MAVE

Deep-joint-learning analysis model of single cell transcriptome and open chromatin accessibility data单细胞转录组和开放染色质可及性数据的深度联合学习分析模型 在同一个细胞中同时分析转录组和染色质可及性信息为了解细胞状态提供了前所未有的解决方案。然而&#x…

[java] 23种设计模式之桥接模式

一、什么是桥接模式 桥接(Bridge)模式属于结构型设计模式。通过提供抽象化和实现化之间的桥接结构&#xff0c;来实现二者的解耦。把抽象(abstraction)与行为实现(implementation)分离开来&#xff0c;从而可以保持各部分的独立性以及应对它们的功能扩展。 二、适用场景 当一…

计算机专业必看的十部电影

计算机专业必看的十部电影 1. 人工智能2. 黑客帝国3. 盗梦空间4. 社交网络5. Her6. 模仿游戏7. 斯诺登8. 头号玩家9. 暗网10. 网络迷踪 计算机专业必看的十部电影&#xff0c;就像一场精彩盛宴&#xff01; 《黑客帝国》让你穿越虚拟世界&#xff0c;感受高科技的魅力《模仿游戏…

SDR架构 (一)为什么基带有I和Q路?

我之前做过自己的RTL-SDR。一直有一个疑惑。为啥rtl2832u芯片有一对差分I路&#xff0c;还有一对差分Q路。差分很好理解是为了抗干扰&#xff0c;但为啥要I和Q呢&#xff1f;并且我也知道不少人在自己修改的时候&#xff0c;保留I路对接在r820t2&#xff08;跟原版一样&#xf…

重学SpringBoot3-@EnableConfigurationProperties注解

重学SpringBoot3-EnableConfigurationProperties注解 1. 引言2. EnableConfigurationProperties 的作用3. 使用示例4. 总结 1. 引言 Spring Boot 提供了一种便捷的方式来管理和校验应用程序的配置&#xff0c;即通过类型安全的配置属性。EnableConfigurationProperties 注解在…

【论文】Continuous Rapid Action Value Estimates阅读笔记

之前在阅读KR-UCT论文时&#xff0c;里面提到过与UCT结合的主要两种启发式方法旨在指导探索策略&#xff0c;通过使用渐进拓宽&#xff08;PW&#xff09;限制考虑的行动的数量&#xff0c;并使用快速行动价值估计&#xff08;RAVE&#xff09;选择最有前途的行动。因此找了一篇…

C++模板完整版

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C从入门到精通》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 一、泛型编程 如何实现一个通用的交换函数呢&#xff1f; void Swap(int& left, int& right) {int temp left…

[SpringCloud] OpenFeign核心架构原理 (一)

Feign的本质: 动态代理 七大核心组件 Feign底层是基于JDK动态代理来的, Feign.builder()最终构造的是一个代理对象, Feign在构建对象的时候会解析方法上的注解和参数, 获取Http请求需要用到基本参数以及和这些参数和方法参数的对应关系。然后发送Http请求, 获取响应, 再根据响…

需求评审会常见的5大核心问题

需求评审会是项目管理过程中的一个重要环节&#xff0c;其核心问题的顺利讨论和评审&#xff0c;对项目来说非常重要。其有助于项目成员对需求理解达成共识&#xff0c;明确需求的内容、目标和预期结果&#xff0c;尽早发现需求不合理之处&#xff0c;从而能够及时调整和完善&a…