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 相关文章推荐
TopList标签和JavaScript结合两例
Aug 12 Javascript
JavaScript 实现模态对话框 源代码大全
May 02 Javascript
javascript复制对象使用说明
Jun 28 Javascript
jquery固定底网站底部菜单效果
Aug 13 Javascript
BootStrap的弹出框(Popover)支持鼠标移到弹出层上弹窗层不隐藏的原因及解决办法
Apr 03 Javascript
Bootstrap基本样式学习笔记之按钮(4)
Dec 07 Javascript
canvas雪花效果核心代码分享
Feb 19 Javascript
bing Map 在vue项目中的使用详解
Apr 09 Javascript
详解javascript设计模式三:代理模式
Mar 25 Javascript
Vue 指令实现按钮级别权限管理功能
Apr 23 Javascript
Vue 自定义标签的src属性不能使用相对路径的解决
Sep 17 Javascript
vue修改Element的el-table样式的4种方法
Sep 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遍历二维数组的代码
2011/04/22 PHP
ThinkPHP框架设计及扩展详解
2014/11/25 PHP
PHP调试及性能分析工具Xdebug详解
2017/02/09 PHP
Laravel网站打开速度优化的方法汇总
2017/07/16 PHP
不同的jQuery API来处理不同的浏览器事件
2012/12/09 Javascript
JavaScript中的运算符种类及其规则介绍
2013/09/26 Javascript
使用jquery+CSS实现控制打印样式
2014/12/31 Javascript
jQuery-1.9.1源码分析系列(十一)DOM操作续之克隆节点
2015/12/01 Javascript
Javascript删除指定元素节点的方法
2016/06/21 Javascript
详解JSON1:使用TSQL查询数据和更新JSON数据
2016/11/21 Javascript
实现两个文本框同时输入的实例
2017/09/25 Javascript
vue.js给动态绑定的radio列表做批量编辑的方法
2018/02/28 Javascript
Angular 容器部署的方法
2018/04/17 Javascript
vue中使用sessionStorage记住密码功能
2018/07/24 Javascript
node错误处理与日志记录的实现
2018/12/24 Javascript
将Vue组件库更换为按需加载的方法步骤
2020/05/06 Javascript
微信小程序实现简单文字跑马灯
2020/05/26 Javascript
Vue.js中使用Vuex实现组件数据共享案例
2020/07/31 Javascript
[01:10:27]DOTA2-DPC中国联赛正赛 SAG vs XG BO3 第二场 3月5日
2021/03/11 DOTA
Python实现全局变量的两个解决方法
2014/07/03 Python
解决Python出现_warn_unsafe_extraction问题的方法
2016/03/24 Python
使用python存储网页上的图片实例
2018/05/22 Python
Tensorflow 合并通道及加载子模型的方法
2018/07/26 Python
基于PyTorch的permute和reshape/view的区别介绍
2020/06/18 Python
Sephora丝芙兰印尼官方网站:购买化妆品和护肤品
2018/07/02 全球购物
Urban Decay官方网站:美国化妆品品牌
2020/06/04 全球购物
explicit和implicit的含义
2012/11/15 面试题
浅谈react路由传参的几种方式
2021/03/23 Javascript
优秀毕业生自我鉴定
2014/01/19 职场文书
小学中秋节活动方案
2014/02/06 职场文书
中学生学雷锋活动心得体会
2014/03/10 职场文书
2014年五四青年节活动策划书
2014/04/22 职场文书
优秀教师个人总结
2015/02/11 职场文书
2016年机关单位节能宣传周活动总结
2016/04/05 职场文书
基于Redis延迟队列的实现代码
2021/05/13 Redis
JAVA API 实用类 String详解
2021/10/05 Java/Android