iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >React怎么结合Drag API实现拖拽效果
  • 476
分享到

React怎么结合Drag API实现拖拽效果

2023-07-05 09:07:24 476人浏览 独家记忆
摘要

本篇内容主要讲解“React怎么结合Drag api实现拖拽效果”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“React怎么结合Drag API实现拖拽效果”吧!认识拖拽鼠标

本篇内容主要讲解“React怎么结合Drag api实现拖拽效果”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“React怎么结合Drag API实现拖拽效果”吧!

    认识拖拽

    鼠标拖拽是一个常见的交互场景,在这个熟悉的过程将会发生哪些事件?

    React怎么结合Drag API实现拖拽效果

    拖拽事件指用户通过鼠标(或其他指针设备)将元素移到一个新的位置上。拖拽过程涉及两个对象:被拖拽元素(上图中 A )和可释放目标(上图中 B )

    被拖拽元素

    默认情况下,图片、链接和文本是可拖动的。HTML5 在所有 html 元素上规定了一个 draggable 属性, 表示元素是否可以拖动。图片和链接的 draggable 属性自动被设置为 true,而其他所有元素此属性的默认值为 false。

    某个元素被拖动时,会依次触发以下事件:

    • ondragstart:拖动开始,当鼠标按下并且开始移动鼠标时,触发此事件;整个周期只触发一次;

    • ondrag:只要元素仍被拖拽,就会持续触发此事件;

    • ondragend:拖拽结束,当鼠标松开后,会触发此事件;整个周期只触发一次。

    可释放目标

    当把拖拽元素移动到一个有效的放置目标时,目标对象会触发以下事件:

    • ondragenter:只要一把拖拽元素移动到目标时,就会触发此事件;

    • ondraGover:拖拽元素在目标中拖动时,会持续触发此事件;

    • ondragleaveondrop:拖拽元素离开目标时(没有在目标上放下),会触发ondragleave;当拖拽元素在目标放下(松开鼠标),则触发ondrop事件。

    目标元素默认是不能够被拖放的,即不会触发 ondrop 事件,可以通过在目标元素的 ondragover 事件中取消默认事件来解决此问题。

    生命周期

    React怎么结合Drag API实现拖拽效果

    拖拽操作中的数据传输

    除非数据受影响,否则简单的拖放并没有实际意义。为实现拖动操作中的数据传输,event 对象上暴露了 dataTransfer 对象,用于从被拖动元素向放置目标传递字符串数据。我们使用它来通知画布,当前需要渲染的组件是什么。

    dataTransfer 对象主要有两个方法:getData() 和 setData(),分别用来获取和存储值。setData()的第一个参数以及 getData()的唯一参数是一个字符串,表示要设置的数据类型:"text"或"URL"

    ???? 虽然这两种数据类型是 IE 最初引入的,但 HTML5 已经将其扩展为允许任何 MIME 类型。为向后 兼容,HTML5 还会继续支持"text"和"URL",但它们会分别被映射到"text/plain"和"text/uri-list”

    需要注意的是:存储在 dataTransfer 对象中的数据只能在放置事件中读取。如果没有在 ondrop 事件中取得这些数据,dataTransfer 对象就会被销毁,数据也会丢失。

    代码实现

    我在项目中使用 React 来实现,并且考虑到跨组件通信,我使用了 dva 来管理数据流。

    如何标记当前拖拽的元素?

    HTML5 支持的 data-x 属性,我们可以将当前组件的类型 Rectangle 赋值给它,这样处理和画布组件通信方便一些

    const Block = (props) => {  const handleDragStart = (e: React.DragEvent<HTMLDivElement>) => {    // 向拖拽数据中添加项目        e.dataTransfer.setData('text', e.target.dataset.index);  };  return (    <div onDragStart={handleDragStart}>      <Button draggable data-index="Rectangle">        二维码      </Button>    </div>  );};

    在上文中讲到,dataTransfer 的数据必须在 handleDrop 方法中获取。实际的用来保存画布中的所有组件的数据:

    function DragEditor(props) {  const { dvaStore, dispatch } = props;  // 阻止浏览器默认事件,否则 ondrop 不会触发  const handleDragOver = (e: React.DragEvent<HTMLDivElement>) => {    e.preventDefault();  };  const handleDrop = (e: React.DragEvent<HTMLDivElement>) => {    e.preventDefault();    // 获取拖拽元素的组件类型    const type = e.dataTransfer.getData('text');    // COMPONENT_LIST 定义了组件的数据格式,根据 type 匹配    const component = COMPONENT_LIST.filter(      (i) => i.component === type,    )[0];    // 将组件数据添加到 store,画布将会根据数据渲染出组件    if (component) {      dispatch?.({        type: 'store/addComponent',        payload: component,      });    }  };  return (...);}

    在画布中拖动

    拖动主要依赖组件的初始位置,鼠标开始位置、结束位置。根据后两组得到鼠标移动的距离,和初始位置相加后,得到最终位置。

    function DragEditor(props: IEditorProps) {  const { dvaStore, dispatch } = props;  const [startAxis, setStartAxis] = React.useState({ x: 0, y: 0 }); // 鼠标开始拖动时的位置  const handleDragStart = (e: React.DragEvent<HTMLDivElement>) => {    setStartAxis({ x: e.clientX, y: e.clientY });  };  const handleDragEnd = (e: React.DragEvent<HTMLDivElement>, data: IComponentSchema) => {    // 鼠标移动的距离    const displacementX = e.clientX - startAxis.x;    const displacementY = e.clientY - startAxis.y;    // 计算组件的终点位置:初始位置 + 鼠标移动的距离    const endX = Number(data.style.left) + displacementX;    const endY = Number(data.style.top) + displacementY;    // 限制坐标的最小值为 0    const top = Math.max(endY, 0);    const left = Math.max(endX, 0);    // 更新当前组件样式    dispatch?.({      type: 'store/setShapeStyle',      payload: { top, left },    });  };  return (      {dvaStore.componentsData.map((i) => {        return (          <RenderComponent            type={i.component}            componentData={i}            key={i.generateId}            onDragStart={handleDragStart}            onDragEnd={(e) => handleDragEnd(e, i)}          />        );      })}  );}

    数据结构

    最后,就是组件和数据结构的设计,RenderComponent 是一个自定义的组件,会根据传入的 type 属性渲染对应的组件。组件的数据结构设计如下:

    export const COMPONENT_LIST = [  {    component: 'Rectangle', // 组件名称    label: '矩形', // 左侧 Blocks 组件列表中显示的名字    propValue: '', // 组件所使用的值    icon: 'BorderOuterOutlined', // 左侧组件列表中显示的 icon 图标    animations: [], // 动画列表    events: {}, // 事件列表    style: {    // 组件样式      width: 100,      height: 100,      top: 0,      left: 0,    },  },  {    component: 'Text',    label: '文字',    propValue: '文字',    icon: '',    animations: [],    events: {},    style: {      width: 200,      height: 33,      fontSize: 14,      fontWeight: 500,      lineHeight: '',      letterSpacing: 0,      textAlign: '',      color: '',    },  },];

    到此,相信大家对“React怎么结合Drag API实现拖拽效果”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

    --结束END--

    本文标题: React怎么结合Drag API实现拖拽效果

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

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

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

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

    下载Word文档
    猜你喜欢
    • React怎么结合Drag API实现拖拽效果
      本篇内容主要讲解“React怎么结合Drag API实现拖拽效果”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“React怎么结合Drag API实现拖拽效果”吧!认识拖拽鼠标...
      99+
      2023-07-05
    • React结合Drag API实现拖拽示例详解
      目录认识拖拽被拖拽元素可释放目标生命周期拖拽操作中的数据传输代码实现如何标记当前拖拽的元素?在画布中拖动数据结构总结认识拖拽 鼠标拖拽是一个常见的交互场景,在这个熟悉的过程将会发生...
      99+
      2023-03-06
      React Drag API拖拽 React Drag API
    • 怎么实现react拖拽hooks
      这篇文章主要介绍了怎么实现react拖拽hooks,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。前言源码总共也就一百多行,看完这个大致可以理解一些成熟的react拖拽库的实现...
      99+
      2023-06-14
    • AndroidRecycleView实现Item拖拽效果
      基于公司产品的优化需求,其中一个需求涉及到RecycleView的拖拽,以及拖拽后item位置的持久化,目的是可以用户自定义界面偏好,并在用户下次进入本界面后,之前设置的偏好仍然有效...
      99+
      2024-04-02
    • jQuery怎么实现拖拽排序效果
      这篇文章给大家分享的是有关jQuery怎么实现拖拽排序效果的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。增强动态增加Div效果原来没有新建动作,分析代码后发现很容易增强~~<...
      99+
      2024-04-02
    • JavaScript怎么实现拖拽排序效果
      这篇“JavaScript怎么实现拖拽排序效果”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“JavaScript怎么实现拖拽...
      99+
      2023-06-30
    • JavaScript实现拖拽简单效果
      本文实例为大家分享了JavaScript实现拖拽效果的具体代码,供大家参考,具体内容如下 1.1 拖拽的基本效果 思路: 鼠标在盒子上按下时,准备移动 (事件加给物体) 鼠标移动时,...
      99+
      2024-04-02
    • vue-draggable怎么实现pc端拖拽效果
      本文小编为大家详细介绍“vue-draggable怎么实现pc端拖拽效果”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue-draggable怎么实现pc端拖拽效果”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧...
      99+
      2023-06-29
    • JavaScript怎么实现模态框拖拽效果
      这篇文章主要介绍“JavaScript怎么实现模态框拖拽效果”,在日常操作中,相信很多人在JavaScript怎么实现模态框拖拽效果问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JavaScript怎么实现模...
      99+
      2023-06-22
    • vue实现拖拽排序效果
      本文实例为大家分享了vue实现拖拽排序效果的具体代码,供大家参考,具体内容如下 效果预览 组件 drag.vue <template>   <Transition...
      99+
      2024-04-02
    • JavaScript实现简单拖拽效果
      本文实例为大家分享了JavaScript实现简单拖拽效果的具体代码,供大家参考,具体内容如下 先看实现的效果: 思路:里面用到了三个事件,鼠标按下、移动、松开事件 那么首先创建盒子...
      99+
      2024-04-02
    • 拖拽插件sortable.js实现el-table表格拖拽效果
      目录问题描述案例一 简单拖拽代码附上案例二 el-table表格拖拽效果图代码附上问题描述 Sortable.js是一款优秀的js拖拽库,因为是原生js写的,所以性能不错,也支持移动...
      99+
      2024-04-02
    • vue实现弹窗拖拽效果
      本文实例为大家分享了vue实现弹窗拖拽效果的具体代码,供大家参考,具体内容如下 前言 实现拖拽其实简单来说就分为三步 一、创建一个js文件 因为本身dialog窗口不具备移动拖拽能力...
      99+
      2024-04-02
    • JavaScript实现鼠标拖拽效果
      本文实例为大家分享了JavaScript实现鼠标拖拽效果的具体代码,供大家参考,具体内容如下 这次的效果图如下: 我认为这个实验的难点是保持盒子和鼠标的相对位置不变,通过鼠标按下和...
      99+
      2024-04-02
    • 怎么用JavaScript实现简单的拖拽效果
      这篇文章主要介绍“怎么用JavaScript实现简单的拖拽效果”,在日常操作中,相信很多人在怎么用JavaScript实现简单的拖拽效果问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用JavaScript...
      99+
      2023-06-25
    • vue怎么实现列表拖拽排序效果
      这篇文章主要介绍“vue怎么实现列表拖拽排序效果”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“vue怎么实现列表拖拽排序效果”文章能帮助大家解决问题。效果如下:<template>&nb...
      99+
      2023-06-29
    • JavaScript实现九宫格拖拽效果
      本文实例为大家分享了JavaScript实现九宫格拖拽效果的具体代码,供大家参考,具体内容如下 关于一些拼图游戏什么的,见人家效果做的不错,参考下别人写的代码,我也尝试着做了个。 &...
      99+
      2024-04-02
    • vue-draggable实现pc端拖拽效果
      本文实例为大家分享了vue-draggable实现pc端拖拽效果的具体代码,供大家参考,具体内容如下 为了实现下面这种布局可拖拽整合调整位置 拖拽前: 拖拽后: 一、安装 npm...
      99+
      2024-04-02
    • Javascript实现登录框拖拽效果
      本文实例为大家分享了Javascript实现登录框拖拽效果的具体代码,供大家参考,具体内容如下 需求分析 1、点击弹出登录框 2、在登录框的特定区域可以将登录框拖拽至任意位置 3...
      99+
      2024-04-02
    • JavaScript实现简单的拖拽效果
      本文实例为大家分享了JavaScript实现简单的拖拽效果的具体代码,供大家参考,具体内容如下 1.先搭架子: * { margin: 0; ...
      99+
      2024-04-02
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作