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 string字符串优化问题
Jul 31 Javascript
JavaScript 选中文字并响应获取的实现代码
Aug 28 Javascript
Javascript中引用示例介绍
Feb 21 Javascript
JavaScript显示当前文档最后修改日期的方法
Mar 19 Javascript
使用递归遍历对象获得value值的实现方法
Jun 14 Javascript
canvas实现图像放大镜
Feb 06 Javascript
Node.js数据库操作之查询MySQL数据库(二)
Mar 04 Javascript
JS实现键值对遍历json数组功能示例
May 30 Javascript
简化vuex的状态管理方案的方法
Jun 02 Javascript
JS+HTML5实现获取手机验证码倒计时按钮
Aug 08 Javascript
vue列表数据发生变化指令没有更新问题及解决方法
Jan 16 Javascript
微信小程序国际化探索实现(附源码地址)
May 20 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
虫族 Zerg 热键控制
2020/03/14 星际争霸
PHP微信红包生成代码分享
2016/10/06 PHP
PHP面向对象程序设计高级特性详解(接口,继承,抽象类,析构,克隆等)
2016/12/02 PHP
PHP设计模式之观察者模式定义与用法分析
2019/04/04 PHP
PHP pthreads v3使用中的一些坑和注意点分析
2020/02/21 PHP
JavaScript Cookie显示用户上次访问的时间和次数
2009/12/08 Javascript
javascript options属性集合操作代码
2009/12/28 Javascript
JavaScript 轻松搞定快捷留言功能 只需一行代码
2010/04/01 Javascript
jsPDF生成pdf后在网页展示实例
2014/01/16 Javascript
jQuery使用正则表达式替换dom元素标签用法示例
2017/01/16 Javascript
微信小程序page的生命周期和音频播放及监听实例详解
2017/04/07 Javascript
js控制文本框禁止输入特殊字符详解
2017/04/07 Javascript
第一次记录Bootstrap table学习笔记(1)
2017/05/18 Javascript
vue.js移动数组位置,同时更新视图的方法
2018/03/08 Javascript
如何基于原生javaScript生成带图片的二维码
2019/11/21 Javascript
基于aotu.js实现微信自动添加通讯录中的联系人功能
2020/05/28 Javascript
[51:52]Liquid vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.24
2019/09/10 DOTA
Python使用新浪微博API发送微博的例子
2014/04/10 Python
python自动化测试之setUp与tearDown实例
2014/09/28 Python
Python实现批量下载图片的方法
2015/07/08 Python
Python实现的随机森林算法与简单总结
2018/01/30 Python
Python中的十大图像处理工具(小结)
2019/06/10 Python
Python实现查找数据库最接近的数据
2020/06/08 Python
django前端页面下拉选择框默认值设置方式
2020/08/09 Python
scrapy实践之翻页爬取的实现
2021/01/05 Python
不同浏览器对CSS3和HTML5的支持状况
2009/10/31 HTML / CSS
C#的几个面试问题
2016/05/22 面试题
领导班子党的群众路线教育实践活动对照检查材料
2014/09/25 职场文书
乡镇群众路线专项整治方案
2014/11/03 职场文书
2014年劳动部工作总结
2014/12/11 职场文书
防汛通知
2015/04/25 职场文书
推普标语口号大全
2015/12/26 职场文书
2019年入党思想汇报
2019/03/25 职场文书
html实现随机点名器的示例代码
2021/04/02 Javascript
MySQL笔记 —SQL运算符
2022/01/18 MySQL
weblogic服务建立数据源连接测试更新mysql驱动包的问题及解决方法
2022/01/22 MySQL