美文网首页
React 九宫格拖拽排序

React 九宫格拖拽排序

作者: IT姑凉 | 来源:发表于2019-07-31 17:40 被阅读0次

实现的效果:

实现的效果

实现步骤

1、列表设置可拖动 draggable='true'
2、拖拽到某个元素,目标元素放大透明动画
3、记录元素移动索引,索引值不同,则排序。
4、数据排序 - splice() 方法,当前拖拽元素更换为目标元素
5、拖拽完成,当前拖拽元素样式还原

部分代码

css:

ul ,li{
  list-style: none
}
ul{
  width:480px;
}
li{
   display:inline-block;
   width:150px;
   height:150px;
   margin:5px;
   line-height:150px;
   text-align:center;
   font-size:30px;
   transition:all .5s;
   -moz-transition:all .5s;
   -webkit-transition:all .5s; 
   -o-transition:all .5s; 
}

js:

class List extends React.Component {
  constructor(props) {
    super(props);
    this.state = {...props};
  }
  
  handleData(){
    this.dragged.style.opacity = "1";
    this.dragged.style.transform = "scale(1)";
    const from = this.dragged.dataset.id;
    const to = this.target.dataset.id;
    if(from !== to ) {
      var data = this.state.data;
      data.splice(to, 0, data.splice(from, 1)[0]);
      this.setState({data: data});
      this.dragged=this.target;
    }
  }
  dragStart(e) {
    this.dragged = e.target;
  }
  drop(e) {
    e.preventDefault();
    this.dragged.style.opacity = "1";
    this.dragged.style.transform = "scale(1)";
  }
  dragOver(e) {
    e.preventDefault();
  }
  dragEnter(e) {
    e.preventDefault();
    if (e.target.tagName !== "LI") {
       return;
    }
    this.target = e.target;
    this.target.style.opacity = "0.2";
    this.target.style.transform = "scale(1.1)";
    this.handleData();
  }

  render() {
    var listItems = this.state.data.map((item, index) => {
      return (
        <li 
          data-id={index}
          key={index}
          style={{background:item.bgColor}}
          draggable='true'
          onDragEnter={this.dragEnter.bind(this)}
          onDrop={this.drop.bind(this)}
          onDragOver={this.dragOver.bind(this)}
          onDragStart={this.dragStart.bind(this)}
          data-item={JSON.stringify(item)}
        >
          {item.index}
        </li>
      )
     });
    return (
      <ul className ="contain">
        {listItems}
      </ul>
    )
  }
}
class App extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      data: [{
          index: 1,
          bgColor: "red"
        },{
          index: 2,
          bgColor: "green"
        },{
          index: 3,
          bgColor: "blue"
        },{
          index: 4,
          bgColor: "yellow"
        },{
          index: 5,
          bgColor: "orange"
        },{
          index: 6,
          bgColor: "grey"
        },{
          index: 7,
          bgColor: "blueviolet"
        },{
          index: 8,
          bgColor: "bisque"
        },{
          index: 9,
          bgColor: "cyan"
        }]
    }
  }
  render() {
    return (
      <div><List data={this.state.data} /></div>
    )
  }
}

ReactDOM.render(
  <App />,
  document.getElementById('app'),
);

demo地址:https://codepen.io/itguliang-the-selector/pen/jgqVzr

原文地址:https://mp.weixin.qq.com/s/2oZuxH2BXgs8RIe22IZjPQ

相关文章

  • React 九宫格拖拽排序

    实现的效果: 实现步骤 1、列表设置可拖动 draggable='true'2、拖拽到某个元素,目标元素放大透明动...

  • react.js 拖拽

    react.js拖拽排序功能的实现 1.使用 react-dnd npm install--save react-...

  • React 拖拽排序

    这篇文章基本骨架来自:文件点击上传和拖拽上传 今天我们要解决的问题就是页面上我们上传了多个文件,我们需要怎么实现移...

  • react-sortable-hoc拖拽无法点击问题解决

    在使用react-sortable-hoc来实现列表拖拽排序时遇到一个问题: 首先看下业务场景,grid布局的拖拽...

  • React实现拖拽排序

    最近有个需求, 需要实现一下拖拽排序, 不需要动画, 能实现功能即可. 现有的类库就不太想集成, 自己手撸一下, ...

  • React Nativie 拖拽排序

    需求 有一个图片上传的功能,选择完图片之后会按照选择顺序进行排序,系统会默认前5张为系统展示图片,其他的图片留存在...

  • iOS collectionView拖拽排序

    iOS collectionView拖拽排序 iOS collectionView拖拽排序

  • source code:TableviewGroup阴影加圆角

    长按拖拽排序(上传者:yeliang_new)长按拖拽排序,拖拽排序。拖拽排序是新闻类的App可以说是必有的交互设...

  • Flutter仿QQ讨论组头像

    前言 上篇文章分享了Flutter仿微信/微博九宫格。已实现类似微信/微博展示图片九宫格,拖拽排序,微信群组头像,...

  • Flutter初探--可拖拽排序的九宫格

    本文通过可拖拽排序的九宫格对Draggable和DragTarget的组合使用进行了说明。组合使用即让DragTa...

网友评论

      本文标题:React 九宫格拖拽排序

      本文链接:https://www.haomeiwen.com/subject/arkhrctx.html