定义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. tcpdump-抓包工具-Linux

    环境:VMware-Workstation-12-Pro,Windows-10,CentOS-6.9-x86_64,Xshell5 基本介绍 tcpdump是Linux自带的抓包工具,可以详细看到计算 ...

  2. Sql Server CPU 性能排查及优化的相关 Sql

    Sql Server CPU 性能排查及优化的相关 Sql 语句,非常好的SQL语句,记录于此: --Begin Cpu 分析优化的相关 Sql --使用DMV来分析SQL Server启动以来累计使 ...

  3. monkey基础学习

    原文地址https://blog.csdn.net/beyond_f/article/details/78543070 一.Monkey测试简介 Monkey测试是Android平台自动化测试的一种手 ...

  4. 开启Virtualization Technology

    怎样开启Virtualization Technology功能 在Win7 或linux x64位系统里装vm,然后新建虚机安装Windows Server 2008 R2 提示一些警告,无法新建虚拟 ...

  5. redis—Spring中redis缓存的简单使用

    这里使用的是 Spring-4.3 , redis-2.8 的版本   1.添加maven依赖 <dependency> <groupId>redis.clients</ ...

  6. poj3608 Bridge Across Islands

    地址:http://poj.org/problem?id=3608 题目: Bridge Across Islands Time Limit: 1000MS   Memory Limit: 65536 ...

  7. uva1416 dijkstra

    大白书P330 这题比较麻烦 给出一个n个节点m条边的无向图,每条边上有一个正权.令c等于每对节点的最短路长度之和.例n=3时, c = d(1,1)+d(1,2)+d(1,3)+d(2,1)+d(2 ...

  8. hdu5091 线段树

    题意: 给了n个点在平面中 n<10000  然后 将这给了一个 宽为W 高为 H 的 矩形, 然后 使得这个矩形可以 涵盖最多的点有多少个,然后矩形的宽平行x 轴高平行y轴.可以将该矩形 水平 ...

  9. Python中的MySQL接口:PyMySQL & MySQLdb

    MySQLdb模块只支持MySQL-3.23到5.5之间的版本,只支持Python-2.4到2.7之间的版本 PyMySQL支持 Python3.0以后的版本 PyMySQL https://pypi ...

  10. SQL学习笔记之项目中常用的19条MySQL优化

    在写文章之前,首先感谢 飞友科技 陆老师提供的文档.. 声明一下:下面的优化方案都是基于 “ Mysql-索引-BTree类型 ” 的 0x00 EXPLAIN 做MySQL优化,我们要善用 EXPL ...