定义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. 【Lua】面向对象编程(二)

      多重继承: module(...,package.seeall) local function search(k,plist) ,#plist do local v=plist[i][k] if ...

  2. (13)如何使用Cocos2d-x 3.0制作基于tilemap的游戏:第一部分

    引言 程序截图: 本教程将会教大家如何使用Cocos2d-x来做一个基于tile地图的游戏,当然还有Tiled地图编辑器.(我们小时候玩的小霸王小学机里面的游戏,大部分都是基于tile地图的游戏,如坦 ...

  3. centos7 lua安装

    yum -y install gcc automake autoconf libtool makeyum install readline-develcurl -R -O http://www.lua ...

  4. KVM入门

    KVM KVM(Kernel-based Virtual Machine)是众多虚拟化技术之一,它是Linux内核中的一个模块,该模块依赖于CPU,如果CPU支持虚拟化,那么该模块才可以被加载.KVM ...

  5. python webdriver grid多节点运行webdriver程序

    grid整理: 机制 Hub机器和节点机器上要装jdk和jar包 A机器:hub  中控:用来监控所有节点机的状态 启动命令: java -jar selenium-server-standalone ...

  6. bzoj1626 / P2872 [USACO07DEC]道路建设Building Roads

    P2872 [USACO07DEC]道路建设Building Roads kruskal求最小生成树. #include<iostream> #include<cstdio> ...

  7. Sybase IQ使用过程中注意事项

    Sybase IQ使用过程中注意事项 1,字母大小写比对不敏感,也就是在值比对判断时大小写字母都一样; 2,等值,或<>判断,系统默认对等式两边比对值去右边空格再进行比较: 3,GROUP ...

  8. Knockout 模板使用

    html 代码: @using GreenWay.Models; @{ Model.Scripts = new string[] { "~/Scripts/paginationViewMod ...

  9. luogu p3366 最小生成树模板

    倒腾了一个小时  自己也没去看网上的 总算自己能写出来模板了 kruskal //最小生成树 每次找最短的边 #include<bits/stdc++.h> using namespace ...

  10. Spark 数据倾斜调优

    一.what is a shuffle? 1.1 shuffle简介 一个stage执行完后,下一个stage开始执行的每个task会从上一个stage执行的task所在的节点,通过网络传输获取tas ...