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动态添加元素事件失效问题解决方法
May 23 Javascript
无刷新上传文件并返回自定义值
Jun 11 Javascript
纯css实现窗户玻璃雨滴逼真效果
Aug 23 Javascript
BootStrap中关于Select下拉框选择触发事件及扩展
Nov 22 Javascript
详解在express站点中使用ejs模板引擎
Sep 21 Javascript
微信小程序实现日历功能
Nov 27 Javascript
js canvas实现二维码和图片合成的海报
Nov 19 Javascript
微信小程序canvas.drawImage完全显示图片问题的解决
Nov 30 Javascript
Vue项目实现简单的权限控制管理功能
Jul 17 Javascript
vue实现直播间点赞飘心效果的示例代码
Sep 20 Javascript
vue计算属性无法监听到数组内部变化的解决方案
Nov 06 Javascript
JavaScript对象属性操作实例解析
Feb 04 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对数组排序的简单实例
2013/12/25 PHP
浅谈PHP中try{}catch{}的使用方法
2016/12/09 PHP
关于Laravel参数验证的一些疑与惑
2019/11/19 PHP
JS 实现点击a标签的时候让其背景更换
2013/10/15 Javascript
JS中getYear()和getFullYear()区别分析
2014/07/04 Javascript
javascript实现带节日和农历的日历特效
2015/02/01 Javascript
轻松学习jQuery插件EasyUI EasyUI实现拖动基本操作
2015/11/30 Javascript
jQuery实现的给图片点赞+1动画效果(附在线演示及demo源码下载)
2015/12/31 Javascript
JS模态窗口返回值兼容问题的完美解决方法
2016/05/28 Javascript
js和C# 时间日期格式转换的简单实例
2016/05/28 Javascript
浅谈事件冒泡、事件委托、jQuery元素节点操作、滚轮事件与函数节流
2017/07/22 jQuery
Nodejs+express+ejs简单使用实例代码
2017/09/18 NodeJs
anime.js 实现带有描边动画效果的复选框(推荐)
2017/12/24 Javascript
AngularJS监听ng-repeat渲染完成的方法
2018/03/20 Javascript
vuejs实现ready函数加载完之后执行某个函数的方法
2018/08/31 Javascript
js代码规范之Eslint安装与配置详解
2018/09/08 Javascript
javascript数组去重方法总结(推荐)
2019/03/20 Javascript
NodeJs操作MongoDB教程之分页功能以及常见问题
2019/04/09 NodeJs
antd vue 刷新保留当前页面路由,保留选中菜单,保留menu选中操作
2020/08/06 Javascript
[50:22]完美盛典-2018年度红毯走秀
2018/12/16 DOTA
Python编程深度学习绘图库之matplotlib
2018/12/28 Python
python lxml中etree的简单应用
2019/05/10 Python
Python中的引用知识点总结
2019/05/20 Python
python sklearn库实现简单逻辑回归的实例代码
2019/07/01 Python
Python使用PyQt5/PySide2编写一个极简的音乐播放器功能
2020/02/07 Python
基于python求两个列表的并集.交集.差集
2020/02/10 Python
Python 字符串处理特殊空格\xc2\xa0\t\n Non-breaking space
2020/02/23 Python
python Selenium 库的使用技巧
2020/10/16 Python
python 多线程爬取壁纸网站的示例
2021/02/20 Python
2014年元旦活动方案
2014/02/15 职场文书
汽车维修求职信
2014/06/15 职场文书
体育专业求职信
2014/07/16 职场文书
化验员岗位职责
2015/02/14 职场文书
李强为自己工作观后感
2015/06/11 职场文书
离职信范本
2015/06/23 职场文书
python制作图形界面的2048游戏, 基于tkinter
2021/04/06 Python