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 相关文章推荐
有关于eclipse配置spket需要注意的一些地方
Apr 07 Javascript
ZeroClipboard插件实现多浏览器复制功能(支持firefox、chrome、ie6)
Aug 30 Javascript
javascript显示中文日期的方法
Jun 18 Javascript
jquery实现的淡入淡出下拉菜单效果
Aug 25 Javascript
javascript url几种编码方式详解
Jun 06 Javascript
bootstrap中使用google prettify让代码高亮的方法
Oct 21 Javascript
详解vue-validator(vue验证器)
Jan 16 Javascript
ndm:NPM的桌面GUI应用程序
Oct 15 Javascript
bootstrap table插件动态加载表头
Jul 19 Javascript
从零使用TypeScript开发项目打包发布到npm
Feb 14 Javascript
基于JavaScript获取url参数2种方法
Apr 17 Javascript
vue实现简单计算商品价格
Sep 14 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
德生BCL3000的电路分析和打磨
2021/03/02 无线电
PHP简单判断iPhone、iPad、Android及PC设备的方法
2016/10/11 PHP
JScript内置对象Array中元素的删除方法
2007/03/08 Javascript
JS 实现导航栏悬停效果(续)
2013/09/24 Javascript
JavaScript支持的最大递归调用次数分析
2014/06/24 Javascript
javascript中实现兼容JAVA的hashCode算法代码分享
2020/08/11 Javascript
jQuery中bind()方法用法实例
2015/01/19 Javascript
详谈jQuery操纵DOM元素属性 attr()和removeAtrr()方法
2015/01/22 Javascript
jQuery实现菜单感应鼠标滑动动画效果的方法
2015/02/28 Javascript
JS密码生成与强度检测完整实例(附demo源码下载)
2016/04/06 Javascript
javaScript事件机制兼容【详细整理】
2016/07/23 Javascript
AngularJS  自定义指令详解及实例代码
2016/09/14 Javascript
js仿小米手机上下滑动效果
2017/02/05 Javascript
Nodejs之http的表单提交
2017/07/07 NodeJs
mpvue 单文件页面配置详解
2018/12/02 Javascript
解决cordova+vue 项目打包成APK应用遇到的问题
2019/05/10 Javascript
layer提示框添加多个按钮选择的实例
2019/09/12 Javascript
vue前端和Django后端如何查询一定时间段内的数据
2021/02/28 Vue.js
[57:09]DOTA2-DPC中国联赛 正赛 Phoenix vs Dynasty BO3 第一场 1月26日
2021/03/11 DOTA
Python使用剪切板的方法
2017/06/06 Python
Python简单删除列表中相同元素的方法示例
2017/06/12 Python
python之DataFrame实现excel合并单元格
2021/02/22 Python
python 变量初始化空列表的例子
2019/11/28 Python
浅谈python输出列表元素的所有排列形式
2020/02/26 Python
Python PyQt5模块实现窗口GUI界面代码实例
2020/05/12 Python
Python3+RIDE+RobotFramework自动化测试框架搭建过程详解
2020/09/23 Python
幼儿教师求职信
2014/05/24 职场文书
安全宣传标语
2014/06/10 职场文书
汉语专业毕业生自荐信
2014/07/06 职场文书
个人作风建设心得体会
2014/10/22 职场文书
财产分割协议书范本
2014/11/03 职场文书
反腐倡廉观后感
2015/06/08 职场文书
大学生支教感言
2015/08/01 职场文书
简历中的自我评价应该这样写!
2019/07/12 职场文书
详解GaussDB for MySQL性能优化
2021/05/18 MySQL
css3手动实现pc端横向滚动
2022/06/21 HTML / CSS