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 相关文章推荐
jQuery第三课 修改元素属性及内容的代码
Mar 14 Javascript
关于Jqzoom的使用心得 jquery放大镜效果插件
Apr 12 Javascript
jQuery 打造动态下滑菜单实现说明
Apr 15 Javascript
iframe 父窗口和子窗口相互的调用方法集锦
Dec 15 Javascript
jquery 插件学习(一)
Aug 06 Javascript
JavaScript中的parse()方法使用简介
Jun 12 Javascript
在JavaScript的jQuery库中操作AJAX的方法讲解
Aug 15 Javascript
jquery判断输入密码两次是否相等
Apr 22 Javascript
javascript中闭包(Closure)详解
Jan 06 Javascript
Vue2.0父组件与子组件之间的事件发射与接收实例代码
Sep 19 Javascript
vue组件的写法汇总
Apr 12 Javascript
详解组件库的webpack构建速度优化
Jun 18 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
用Apache反向代理设置对外的WWW和文件服务器
2006/10/09 PHP
PHP 获取远程网页内容的代码(fopen,curl已测)
2011/06/06 PHP
ThinkPHP模板中判断volist循环的最后一条记录的验证方法
2014/07/01 PHP
PHP通过GD库实现验证码功能示例
2019/02/23 PHP
phpstorm 配置xdebug的示例代码
2019/03/31 PHP
[JS源码]超长文章自动分页(客户端版)
2007/01/09 Javascript
javascript attachEvent和addEventListener使用方法
2009/03/19 Javascript
JavaScript 应用技巧集合[推荐]
2009/08/30 Javascript
关于this和self的使用说明
2010/08/01 Javascript
javascript一个无懈可击的实例化XMLHttpRequest的方法
2010/10/13 Javascript
使用JavaScript检测Firefox浏览器是否启用了Firebug的代码
2010/12/28 Javascript
jQuery中使用data()方法读取HTML5自定义属性data-*实例
2014/04/11 Javascript
用js一次改变多个input的readonly属性值的方法
2014/06/11 Javascript
使用jQuery简单实现模拟浏览器搜索功能
2014/12/21 Javascript
JavaScript实战之带收放动画效果的导航菜单
2016/08/16 Javascript
JavaScript中三个等号和两个等号的区别(== 和 ===)浅析
2016/09/22 Javascript
Java  Spring 事务回滚详解
2016/10/17 Javascript
Bootstrap整体框架之JavaScript插件架构
2016/12/15 Javascript
js实现显示手机号码效果
2017/03/09 Javascript
vue中的非父子间的通讯问题简单的实例代码
2017/07/19 Javascript
JS按条件 serialize() 对应标签的使用方法
2017/07/24 Javascript
详解JavaScript原生封装ajax请求和Jquery中的ajax请求
2019/02/14 jQuery
通过layer实现可输入的模态框的例子
2019/09/27 Javascript
Python浅拷贝与深拷贝用法实例
2015/05/09 Python
python操作文件的参数整理
2019/06/11 Python
Django生成数据库及添加用户报错解决方案
2020/10/09 Python
德国网上药房:Apotal
2017/04/04 全球购物
Famous Footwear加拿大:美国多品牌运动休闲鞋店
2018/12/05 全球购物
仓库管理制度
2014/01/21 职场文书
英语教育专业自荐信
2014/05/29 职场文书
初中教师德育工作总结2015
2015/05/12 职场文书
预备党员考察表党小组意见
2015/06/01 职场文书
工资证明格式模板
2015/06/12 职场文书
地震捐款简报
2015/07/21 职场文书
JavaScript 实现页面滚动动画
2021/04/24 Javascript
Go Grpc Gateway兼容HTTP协议文档自动生成网关
2022/06/16 Golang