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 相关文章推荐
JS实现淘宝幻灯片效果的实现方法
Mar 22 Javascript
JS继承--原型链继承和类式继承
Apr 08 Javascript
简易js代码实现计算器操作
Apr 15 Javascript
jquery实现通用的内容渐显Tab选项卡效果
Sep 07 Javascript
浅析jquery unbind()方法移除元素绑定的事件
May 24 Javascript
JavaScript中的子窗口与父窗口的互相调用问题
Feb 08 Javascript
JS中Swiper的使用和轮播图效果
Aug 11 Javascript
jQuery+koa2实现简单的Ajax请求的示例
Mar 06 jQuery
快速解决处理后台返回json数据格式的问题
Aug 07 Javascript
微信小程序实现签到功能
Oct 31 Javascript
js获取对象,数组所有属性键值(key)和对应值(value)的方法示例
Jun 19 Javascript
JS如何使用剪贴板操作Clipboard API
May 17 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 COOKIE设置为浏览器进程
2009/06/21 PHP
php堆排序实现原理与应用方法
2015/01/03 PHP
PHP中使用break跳出多重循环代码实例
2015/01/21 PHP
PHP魔术方法的使用示例
2015/06/23 PHP
浅谈PHPANALYSIS提取关键字
2019/03/08 PHP
用js实现下载远程文件并保存在本地的脚本
2008/05/06 Javascript
jQuery dialog 异步调用ashx,webservice数据的代码
2010/08/03 Javascript
原生Js实现按的数据源均分时间点幻灯片效果(已封装)
2010/12/28 Javascript
JQuery操作iframe父页面与子页面的元素与方法(实例讲解)
2013/11/20 Javascript
探讨JavaScript中声明全局变量三种方式的异同
2013/12/03 Javascript
js利用事件的阻止冒泡实现点击空白模态框的隐藏
2014/01/24 Javascript
js加载读取内容及显示与隐藏div示例
2014/02/13 Javascript
JavaScript中join()方法的使用简介
2015/06/09 Javascript
nodejs创建web服务器之hello world程序
2015/08/20 NodeJs
基于Jquery easyui 选中特定的tab
2015/11/17 Javascript
详解Vue方法与事件
2017/03/09 Javascript
JavaScript反弹动画效果的实现代码
2017/07/13 Javascript
Vue中保存数据到磁盘文件的方法
2018/09/06 Javascript
搭建基于express框架运行环境的方法步骤
2018/11/15 Javascript
详解JavaScript原生封装ajax请求和Jquery中的ajax请求
2019/02/14 jQuery
微信小程序时间标签和时间范围的联动效果
2019/02/15 Javascript
Python函数的周期性执行实现方法
2016/08/13 Python
python 实现登录网页的操作方法
2018/05/11 Python
windows下 兼容Python2和Python3的解决方法
2018/12/05 Python
Python从单元素字典中获取key和value的实例
2018/12/31 Python
python flask安装和命令详解
2019/04/02 Python
ML神器:sklearn的快速使用及入门
2019/07/11 Python
用Pytorch训练CNN(数据集MNIST,使用GPU的方法)
2019/08/19 Python
python利用datetime模块计算程序运行时间问题
2020/02/20 Python
python使用matplotlib绘制折线图的示例代码
2020/09/22 Python
UGG雪地靴荷兰官网:UGG荷兰
2016/09/09 全球购物
Abe’s of Maine:自1979以来销售相机和电子产品
2016/11/21 全球购物
英国手机壳购买网站:Case Hut
2019/04/11 全球购物
军训学生自我鉴定
2014/02/12 职场文书
2014年客房服务员工作总结
2014/11/18 职场文书
python三子棋游戏
2022/05/04 Python