react.js组件实现拖拽复制和可排序的示例代码


Posted in Javascript onAugust 20, 2018

在实现复制前,对之前的拖拽排序组件属性进行了修改。

  • 摒弃了value中的content属性,拖拽组件暴露的render函数,利用这个属性进行组件内部子组件的渲染,这点主要是参考了蚂蚁金服的Ant design里面一些组件的设计。
  • 为了实现Data和model的脱藕,和sortKey一样,组件增加codeKey属性。

拖拽复制的效果如下:

react.js组件实现拖拽复制和可排序的示例代码

由于实现组件的核心是根据value数据来渲染页面,因此实现拖拽复制功能,只需要在“拖拽释放”的时候,将被拖拽方的数据放到当前目标所在的value数组中即可。

具体实现代码如下:

// 当一个元素或是选中的文字被拖拽释放到一个有效的释放目标位置时
 drop(dropedSort, data, sortKey, dropedUid, codeKey, ee) {
  ee.preventDefault();
  const code = ee.dataTransfer.getData("code");
  const uId = ee.dataTransfer.getData("uId");
  const dragedItem = ee.dataTransfer.getData("item");
  const sort = ee.dataTransfer.getData("sort");
  if (uId === dropedUid) {
   if (sort < dropedSort) {
    data.map(item => {
     if (item[codeKey] === code) {
      item[sortKey] = dropedSort;
     } else if (item[sortKey] > sort && item[sortKey] < dropedSort + 1) {
      item[sortKey]--;
     }
     return item;
    });
   } else {
    data.map(item => {
     if (item[codeKey] === code) {
      item[sortKey] = dropedSort;
     } else if (item[sortKey] > dropedSort - 1 && item[sortKey] < sort) {
      item[sortKey]++;
     }
     return item;
    });
   }
  } else if (this.props.isAcceptAdd) {
   let objDragedItem = JSON.parse(dragedItem);
   if (data.filter(item => item[codeKey] === objDragedItem[codeKey]).length === 0) {
    const maxSort = Math.max.apply(Math, data.map(citem => citem[sortKey]));
    data.map(item => {
     if (dropedSort === maxSort) {
      objDragedItem[sortKey] = dropedSort + 1;
     } else {
      if (item.sort > dropedSort) {
       objDragedItem[sortKey] = dropedSort + 1;
       item[sortKey]++
      }
     }
     return item
    });
    data.push(objDragedItem)
   }
  }
  this.props.onChange(data)
  if (ee.target.className.indexOf('droppingContent') !== -1) {
   ee.target.className = styles.droppedcontent;
  }
 }

这里要注意的有两点:

第一点是,我通过this.props.isAcceptAdd这个属性来判断当前组件是否允许接受拖拽复制的元素。

第二点是,我有一个放在内存中的“uId”,这个“uId”在每个拖拽组件初始化的时候生成。这样我就可以通过它来判断,当前被拖拽到目标区域的元素,是组件本身的内部元素还是外部元素,如果是内部就执行排序功能,外部则执行复制的逻辑代码。

组件API:

react.js组件实现拖拽复制和可排序的示例代码

GitHub地址:https://github.com/VicEcho/VDraggable

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript NaN和Infinity特殊值 [译]
Sep 20 Javascript
简单的代码实现jquery定时器
Nov 17 Javascript
使用简洁的jQuery方法实现隔行换色功能
Jan 02 Javascript
js判断60秒以及倒计时示例代码
Jan 24 Javascript
node.js中的url.format方法使用说明
Dec 10 Javascript
js提交form表单,并传递参数的实现方法
May 25 Javascript
jQuery中table数据的值拷贝和拆分
Mar 19 Javascript
Angular.Js中过滤器filter与自定义过滤器filter实例详解
May 08 Javascript
用户管理的设计_jquery的ajax实现二级联动效果
Jul 13 jQuery
Angular指令之restict匹配模式的详解
Jul 27 Javascript
javascript中call()、apply()的区别
Mar 21 Javascript
vue实现标签云效果的方法详解
Aug 28 Javascript
layui弹出层按钮提交iframe表单的方法
Aug 20 #Javascript
详解如何在Vue里建立长按指令
Aug 20 #Javascript
微信小程序scroll-view实现滚动穿透和阻止滚动的方法
Aug 20 #Javascript
Angular6 写一个简单的Select组件示例
Aug 20 #Javascript
Layer弹出层动态获取数据的方法
Aug 20 #Javascript
layui 给数据表格加序号的方法
Aug 20 #Javascript
解决LayUI表单获取不到data的问题
Aug 20 #Javascript
You might like
php中magic_quotes_gpc对unserialize的影响分析
2014/12/16 PHP
配置Nginx+PHP的正确思路与过程
2016/05/10 PHP
php简单生成一组与多组随机字符串的方法
2017/05/09 PHP
MooTools 1.2中的Drag.Move来实现拖放
2009/09/15 Javascript
jQuery对象和DOM对象的相互转化实现代码
2010/03/02 Javascript
javascript 图片上一张下一张链接效果代码
2010/03/12 Javascript
js函数定时器实现定时读取系统实时连接数
2014/04/30 Javascript
JavaScript判断按钮被点击的方法
2015/12/13 Javascript
jquery单击事件和双击事件冲突解决方案
2016/03/02 Javascript
AngularJS 指令详细介绍
2016/07/27 Javascript
HTML5 JS压缩图片并获取图片BASE64编码上传
2020/11/16 Javascript
纯原生js实现贪吃蛇游戏
2020/04/16 Javascript
微信小程序 支付功能实现PHP实例详解
2017/05/12 Javascript
vue 如何添加全局函数或全局变量以及单页面的title设置总结
2017/06/01 Javascript
详解Vue2 SSR 缓存 Api 数据
2017/11/20 Javascript
详解vue 计算属性与方法跟侦听器区别(面试考点)
2018/04/23 Javascript
浅谈js闭包理解
2019/04/01 Javascript
jQuery实现动态生成年月日级联下拉列表示例
2019/05/11 jQuery
关于layui的下拉搜索框异步加载数据的解决方法
2019/09/28 Javascript
JavaScript基于用户照片姓名生成海报
2020/05/29 Javascript
[00:56]PWL开团时刻DAY8——追追追追追!
2020/11/09 DOTA
使用sklearn之LabelEncoder将Label标准化的方法
2018/07/11 Python
python中dir()与__dict__属性的区别浅析
2018/12/10 Python
python实现集中式的病毒扫描功能详解
2019/07/09 Python
django+echart数据动态显示的例子
2019/08/12 Python
PyCharm2018 安装及破解方法实现步骤
2019/09/09 Python
PyCharm更改字体和界面样式的方法步骤
2019/09/27 Python
python画图常规设置方式
2020/03/05 Python
Python绘制数码晶体管日期
2021/02/19 Python
在HTML5中如何使用CSS建立不可选的文字
2014/10/17 HTML / CSS
HTML5进阶段内联标签汇总(小篇)
2016/07/13 HTML / CSS
YesBabyOnline美国:全球性的在线婚纱礼服工厂
2018/05/05 全球购物
super关键字的用法
2012/04/10 面试题
超市后勤自我鉴定
2014/01/17 职场文书
留学推荐信写作指南
2014/01/25 职场文书
教师节随笔
2015/08/15 职场文书