定义css, 两个动画

.drag-up {
-webkit-animation: dragup ease 0.2s 1;
animation: dragup ease 0.2s 1;
-webkit-animation-fill-mode: forwards;
animation-fill-mode: forwards;
background-color: red;
}
.drag-down {
-webkit-animation: dragdown ease 0.2s 1;
animation: dragdown ease 0.2s 1;
-webkit-animation-fill-mode: forwards;
animation-fill-mode: forwards;
background-color: green;
}
@-webkit-keyframes dragup {
from {
margin-top: 10px;
}
to {
margin-top: 60px;
}
}
@keyframes dragup {
from {
margin-top: 10px;
}
to {
margin-top: 60px;
}
}
@-webkit-keyframes dragdown {
from {
margin-bottom: 10px;
margin-top: 60px;
}
to {
margin-bottom: 60px;
margin-top: 10px;
}
}
@keyframes dragdown {
from {
margin-bottom: 10px;
margin-top: 60px;
}
to {
margin-bottom: 60px;
margin-top: 10px;
}
}

  一个是向上拖拽的动画,一个是向下拖拽的样式。

2.写组件

class List extends React.Component {
constructor(props) {
super(props);
this.state = {...props};
} dragStart(e) {
this.dragged = e.currentTarget;
}
dragEnd(e) {
this.dragged.style.display = ‘block‘; e.target.classList.remove("drag-up");
this.over.classList.remove("drag-up"); e.target.classList.remove("drag-down");
this.over.classList.remove("drag-down"); var data = this.state.data;
var from = Number(this.dragged.dataset.id);
var to = Number(this.over.dataset.id);
data.splice(to, 0, data.splice(from, 1)[0]); //set newIndex to judge direction of drag and drop
data = data.map((doc, index)=> {
doc.newIndex = index + 1;
return doc;
}) this.setState({data: data});
} dragOver(e) {
e.preventDefault(); this.dragged.style.display = "none"; if (e.target.tagName !== "LI") {
return;
} //判断当前拖拽target 和 经过的target 的 newIndex const dgIndex = JSON.parse(this.dragged.dataset.item).newIndex;
const taIndex = JSON.parse(e.target.dataset.item).newIndex;
const animateName = dgIndex > taIndex ? "drag-up" : "drag-down"; if (this.over && e.target.dataset.item !== this.over.dataset.item) {
this.over.classList.remove("drag-up", "drag-down");
} if(!e.target.classList.contains(animateName)) {
e.target.classList.add(animateName);
this.over = e.target;
}
}
render() {
var listItems = this.state.data.map((item, i) => {
return (
<li
data-id={i}
key={i}
style={{height: "60px", border: "solid 1px #cccccc", margin: "10px 30%", borderRadius: "5px", backgroundColor: "green", color: "#ffffff"}}
draggable=‘true‘
onDragEnd={this.dragEnd.bind(this)}
onDragStart={this.dragStart.bind(this)}
data-item={JSON.stringify(item)}
>{item.color}</li>
)
});
return (
<ul onDragOver={this.dragOver.bind(this)} className ="contain">
{listItems}
</ul>
)
}
}
class App extends React.Component {
constructor(props) {
super(props);
this.state = {
data: [
{
newIndex: 1,
color: "red"
}, {
newIndex: 2,
color: "green"
}, {
newIndex: 3,
color: "blue"
}, {
newIndex: 4,
color: "yellow"
}, {
newIndex: 5,
color: "orange"
}, {
newIndex: 6,
color: "black"
}
]
}
}
render() {
return (
<div>
<List data={this.state.data} />
</div>
)
}
} ReactDOM.render(
<App />,
document.getElementById(‘app‘),
);

解释几个三个方法
1.dragStart  把 target 赋值给了this

2.dragOver 把经过的 li 赋值给了 this, 并且在经过的li上,添加对应的class, 实现动画效果。 这里比较了序号,判断当前是向哪个方向拖拽。  并且比较了 经过li是否是同一个,不是的话,移除动画效果。

3.dragEnd, 移除动画效果, 并且比较数据,setState到最新的数据。

总结, 有点dom操作的思想。

demo地址: https://codepen.io/jhonyoung/pen/PeGpNL

原创。

react 拖拽排序

标签:方向   lis   ext   classlist   地址   项目   event   end   mes

原文地址:https://www.cnblogs.com/jhonyoung/p/8954512.html

react 拖拽排序---原生的更多相关文章

  1. 移动端的拖拽排序在react中实现 了解一下

    最近做一个拖拽排序的功能找了好几个有一个步骤简单,结合redux最好不过了,话不多说上代码 第一步: npm install react-draggable-tags --save 第二步 sort. ...

  2. React造轮子:拖拽排序组件「Dragact」

    先来一张图看看: 项目地址:Github地址 (无耻求星!) 在线观看(第一次加载需要等几秒):预览地址 说起来不容易,人在国外没有过年一说,但是毕竟也是中国年,虽然不放假,但是家里总会主内一顿丰盛的 ...

  3. react拖拽(表格拖拽排序、普通拖拽排序以及树形拖拽排序)

    表格拖拽排序:组件地址:https://reactabular.js.org/#/drag-and-drop 拖动的排序是用React-DnD:React-DnD:http://react-dnd.g ...

  4. Vue 表单拖拽排序

    Vue table表单拖拽 业务需求: 因为数据展示使用的是 elementUI 的 Table进行数据展示的,现在的需求是通过拖拽表单进行表单排序.同时,动态修改表单中的数据排列顺序.查阅了好多资料 ...

  5. vue实现拖拽排序

    基于vue实现列表拖拽排序的效果 在日常开发中,特别是管理端,经常会遇到要实现拖拽排序的效果:这里提供一种简单的实现方案. 此例子基于vuecli3 首先,我们先了解一下js原生拖动事件: 在拖动目标 ...

  6. dragsort html拖拽排序

    一.Jquery List DragSort 对于有些页面,如首页的定制,需要进行动态的拖拽排序.由于自己实现比较困难,我们一般会使用一些js插件来实现.dragsort 就是帮助我们完成这一需求.通 ...

  7. jQuery可拖拽排序列表jquery-sortable-lists

    jquery-sortable-lists可以通过鼠标进行拖动排列树型菜单,可以定义某个列表元素是否拖动,拖动后回调,点击可以折叠树型结点,可以用来在后台模仿wordpress后台拖动菜单,实现多级菜 ...

  8. 使用knockout-sortable实现对自定义菜单的拖拽排序

    在开始之前,照例,我们先看效果和功能实现. 关于自定义菜单的实现,这里就不多说了,需要了解的请访问:http://www.cnblogs.com/codelove/p/4838766.html 这里需 ...

  9. RecyclerView拖拽排序和滑动删除实现

    效果图 如何实现 那么是如何实现的呢?主要就要使用到ItemTouchHelper ,ItemTouchHelper 一个帮助开发人员处理拖拽和滑动删除的实现类,它能够让你非常容易实现侧滑删除.拖拽的 ...

随机推荐

  1. oracle 安装,登陆,配置

    1:查看: https://blog.csdn.net/u014177640/article/details/71023380/ 2:登陆  https://zhidao.baidu.com/ques ...

  2. Nginx 403 forbidden原因及故障模拟重现(转载)

    这篇文章是转载过来的一篇文章,觉得不错,因此做个记录. 访问Nginx出现状态码为403 forbidden原因及故障模拟 1) nginx配置文件里不配置默认首页参数或者首页文件在站点目录下没有 i ...

  3. Java基础教程:注解

    Java基础教程:注解 本篇文章参考的相关资料链接: 维基百科:https://zh.wikipedia.org/wiki/Java%E6%B3%A8%E8%A7%A3 注解基础与高级应用:http: ...

  4. python中的shallow copy 与 deep copy

    今天在写代码的时候遇到一个奇葩的问题,问题描述如下: 代码中声明了一个list,将list作为参数传入了function1()中,在function1()中对list进行了del()即删除了一个元素. ...

  5. VS2010/MFC编程入门之二十九(常用控件:列表视图控件List Control 下)

    上一节是关于列表视图控件List Control的上半部分,简单介绍了列表视图控件,其通知消息的处理和有关结构体的定义.本节继续讲解下半部分,包括列表视图控件的创建.CListCtrl类的主要成员函数 ...

  6. 11Qt样式表

    Qt样式表 Qt样式表的思想很大程度上是来自原HTML的层叠式样式表(CSS),通过调用Qwdiget::setStyleSheet()或是Qapplication::setStyleSheet(), ...

  7. jquery 添加列

    {field:'action',title:'操作',width:70,align:'center',  formatter:function(value,row,index){  if (row.e ...

  8. 理解Linux系统中的load average(图文版)

    本文转自:http://heipark.iteye.com/blog/1340384 一.什么是load average? linux系统中的Load对当前CPU工作量的度量 (WikiPedia: ...

  9. python连接MySQL数据库问题

    Python 数据库图解流程 Connection.Cursor比喻 Connection()的参数列表 host,连接的数据库服务器主机名,默认为本地主机(localhost).user,连接数据库 ...

  10. 20145315 《Java程序设计》第九周学习总结

    20145315 <Java程序设计>第九周学习总结 教材学习内容总结 第16章--整合数据库 16.1.1JDBC简介 应用程序通过通信协议对数据库进行指令交换,以进行对数据的的增删查找 ...