react 拖拽排序---原生
定义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
原创。
标签:方向 lis ext classlist 地址 项目 event end mes
原文地址:https://www.cnblogs.com/jhonyoung/p/8954512.html
react 拖拽排序---原生的更多相关文章
- 移动端的拖拽排序在react中实现 了解一下
最近做一个拖拽排序的功能找了好几个有一个步骤简单,结合redux最好不过了,话不多说上代码 第一步: npm install react-draggable-tags --save 第二步 sort. ...
- React造轮子:拖拽排序组件「Dragact」
先来一张图看看: 项目地址:Github地址 (无耻求星!) 在线观看(第一次加载需要等几秒):预览地址 说起来不容易,人在国外没有过年一说,但是毕竟也是中国年,虽然不放假,但是家里总会主内一顿丰盛的 ...
- react拖拽(表格拖拽排序、普通拖拽排序以及树形拖拽排序)
表格拖拽排序:组件地址:https://reactabular.js.org/#/drag-and-drop 拖动的排序是用React-DnD:React-DnD:http://react-dnd.g ...
- Vue 表单拖拽排序
Vue table表单拖拽 业务需求: 因为数据展示使用的是 elementUI 的 Table进行数据展示的,现在的需求是通过拖拽表单进行表单排序.同时,动态修改表单中的数据排列顺序.查阅了好多资料 ...
- vue实现拖拽排序
基于vue实现列表拖拽排序的效果 在日常开发中,特别是管理端,经常会遇到要实现拖拽排序的效果:这里提供一种简单的实现方案. 此例子基于vuecli3 首先,我们先了解一下js原生拖动事件: 在拖动目标 ...
- dragsort html拖拽排序
一.Jquery List DragSort 对于有些页面,如首页的定制,需要进行动态的拖拽排序.由于自己实现比较困难,我们一般会使用一些js插件来实现.dragsort 就是帮助我们完成这一需求.通 ...
- jQuery可拖拽排序列表jquery-sortable-lists
jquery-sortable-lists可以通过鼠标进行拖动排列树型菜单,可以定义某个列表元素是否拖动,拖动后回调,点击可以折叠树型结点,可以用来在后台模仿wordpress后台拖动菜单,实现多级菜 ...
- 使用knockout-sortable实现对自定义菜单的拖拽排序
在开始之前,照例,我们先看效果和功能实现. 关于自定义菜单的实现,这里就不多说了,需要了解的请访问:http://www.cnblogs.com/codelove/p/4838766.html 这里需 ...
- RecyclerView拖拽排序和滑动删除实现
效果图 如何实现 那么是如何实现的呢?主要就要使用到ItemTouchHelper ,ItemTouchHelper 一个帮助开发人员处理拖拽和滑动删除的实现类,它能够让你非常容易实现侧滑删除.拖拽的 ...
随机推荐
- EasyUI Droppable 可放置
通过 $.fn.droppable.defaults 重写默认的 defaults. 用法 通过标记创建可放置(droppable)区域. <div class="easyui-dro ...
- (转)帮你深入理解OAuth2.0协议
1. 引言 如果你开车去酒店赴宴,你经常会苦于找不到停车位而耽误很多时间.是否有好办法可以避免这个问题呢?有的,听说有一些豪车的车主就不担心这个问题.豪车一般配备两种钥匙:主钥匙和泊车钥匙.当你到酒店 ...
- Java系列介绍
Java系列目录 重新编写equals()方法,hashCode()方法,以及toString(),提供自定义的相等标准,以及自描述函数 Java 7新增功能 Java应用程序中System.out. ...
- 2006 - MySQL server has gone away
mysql出现ERROR : (2006, 'MySQL server has gone away') 的问题意思就是指client和MySQL server之间的链接断开了. 造成这样的原因一般是s ...
- C# 复杂格式多级深度XML序列化反序列化
default.xml 文件如下: <config><partnerships> <partnership name="Main_Listener" ...
- Kylo 入坑记
一.概述 Kylo,作为一个基于 Spark 和 NiFi 的开源数据湖编排框架,解决对数据湖获取.治理.感知和技术支持等诸多问题.Kylo 将数据湖的很多功能自动化,包括数据接入.准备.分析发现.P ...
- windows监听socket和标准输入
原来的代码 def input_command(self): msg = raw_input('\nPlease input the command:') remote_id = raw_input( ...
- Ubuntu16.04桌面系统如何配置和启动wireshark
上一篇介绍了在Ubuntu系统中安装wireshark 本篇介绍在Ubuntu系统中配置和启动wireshark: 安装好后,直接在终端运行$ wireshark.出于安全方面的考虑,普通用户不能够打 ...
- iframe 跨域问题解决方案 利用window.name+iframe跨域获取数据详解
详解 前文提到用jsonp的方式来跨域获取数据,本文为大家介绍下如何利用window.name+iframe跨域获取数据. 首先我们要简单了解下window.name和iframe的相关知识.ifra ...
- 20145211《网络对抗》逆向及BOF基础实践
逆向及BOF基础实践——又是一年梅落时 一.实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. ...