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 相关文章推荐
HTML5附件拖拽上传drop &amp; google.gears实现代码
Apr 28 Javascript
ParseInt函数参数设置介绍
Jan 02 Javascript
jQuery实现动画效果的简单实例
Jan 27 Javascript
js动态往表格的td中添加图片并注册事件
Jun 12 Javascript
javascript事件模型实例分析
Jan 30 Javascript
jQuery实现动态添加和删除一个div
Aug 12 Javascript
jquery Ajax实现Select动态添加数据
Jun 08 jQuery
关于vue v-for 循环问题(一行显示四个,每一行的最右边那个计算属性)
Sep 04 Javascript
小程序实现列表多个批量倒计时
Jan 29 Javascript
Vue2.0实现组件之间数据交互和通信操作示例
May 16 Javascript
js实现列表向上无限滚动
Jan 13 Javascript
微信小程序自定义胶囊样式
Dec 27 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准确取得服务器IP地址的方法
2015/06/02 PHP
[原创]php token使用与验证示例【测试可用】
2017/08/30 PHP
js hover 定时器(实例代码)
2013/11/12 Javascript
jQuery的load()方法及其回调函数用法实例
2015/03/25 Javascript
jQuery中 prop() attr()使用详解
2015/05/19 Javascript
前端框架Vue.js构建大型应用浅析
2016/09/12 Javascript
原生的强大DOM选择器querySelector介绍
2016/12/21 Javascript
Bootstrap框架安装使用详解
2017/01/21 Javascript
JS字符串长度判断,超出进行自动截取的实例(支持中文)
2017/03/06 Javascript
用vue-cli开发vue时的代理设置方法
2018/09/20 Javascript
element-ui的回调函数Events的用法详解
2018/10/16 Javascript
react实现antd线上主题动态切换功能
2019/08/12 Javascript
JavaScript实现轮播图效果代码实例
2019/09/28 Javascript
vue过滤器实现日期格式化的案例分析
2020/07/02 Javascript
[06:24]DOTA2亚洲邀请赛小组赛第三日 TOP10精彩集锦
2015/02/01 DOTA
Python编程使用*解包和itertools.product()求笛卡尔积的方法
2017/12/18 Python
基于python list对象中嵌套元组使用sort时的排序方法
2018/04/18 Python
python绘制直线的方法
2018/06/30 Python
python opencv实现切变换 不裁减图片
2018/07/26 Python
python机器学习之KNN分类算法
2018/08/29 Python
Python实现将通信达.day文件读取为DataFrame
2018/12/22 Python
用Python读取几十万行文本数据
2018/12/24 Python
ubuntu 16.04下python版本切换的方法
2019/06/14 Python
python 接口实现 供第三方调用的例子
2019/08/13 Python
Flask中endpoint的理解(小结)
2019/12/11 Python
Windows 下python3.8环境安装教程图文详解
2020/03/11 Python
django 取消csrf限制的实例
2020/03/13 Python
对Pytorch 中的contiguous理解说明
2021/03/03 Python
abstract 可以和 virtual 一起使用吗?可以和 override 一起使用吗?
2012/10/15 面试题
自主招生教师推荐信
2014/05/10 职场文书
2014年协会工作总结
2014/11/22 职场文书
美丽人生观后感
2015/06/03 职场文书
2016年植树节红领巾广播稿
2015/12/17 职场文书
《追风筝的人》:人心中的成见是座大山,但请不忘初心
2019/11/15 职场文书
Python数据清洗工具之Numpy的基本操作
2021/04/22 Python
Python使用protobuf序列化和反序列化的实现
2021/05/19 Python