美文网首页
React实现拖拽排序

React实现拖拽排序

作者: Oo晨晨oO | 来源:发表于2018-09-10 18:59 被阅读1298次

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

1. 首先设置state

constructor(props) {
    super(props);
    this.state = {
      dataArray: [],
      dragElement: null,
      lock: true,
    };
  }

这个dataArray就是我们的数据源

2. 在componentDidMount中阻止一下dragover和drop得默认行为

componentDidMount() {
    document.addEventListener('dragover', this.preventDefault);
    document.addEventListener('drop', this.preventDefault);
  }

3. 在componentWillUnmount中删除监听器

componentWillUnmount() {
    document.removeEventListener('dragover', this.preventDefault);
    document.removeEventListener('drop', this.preventDefault);
  }

4. 给要排序的元素实现如下属性

sortableCard = (sortableInfo) => {
    const { id } = sortableInfo;
    }
    return (
      <div
        key={id}
        draggable
        onDragStart={() => {
          this.setState({
            dragElement: sortableInfo,
          });
        }}
        onDragEnd={(e) => {
          e.preventDefault();
        }}
        onDragEnter={() => {
          if (id !== this.state.dragElement.id) {
            const oldDragIndex = _.findIndex(this.state.dataArray, item => item.id === this.state.dragElement.id);
            const oldEnterIndex = _.findIndex(this.state.dataArray, item => item.id === sortableInfo.id);
            if (oldDragIndex > oldEnterIndex) {
              const newDataArray= this.state.dataArray.filter(item => item.id !== this.state.dragElement.id);
              const insertIndex = _.findIndex(newDataArray, item => item.id === sortableInfo.id);
              newDataArray.splice(insertIndex, 0, this.state.dragElement);
              this.setState({ dataArray: newDataArray });
            } else {
              const newDataArray = this.state.dataArray.filter(item => item.id !== this.state.dragElement.id);
              const insertIndex = _.findIndex(newDataArray, item => item.Id === sortableInfo.id) + 1;
              newDataArray.splice(insertIndex, 0, this.state.dragElement);
              this.setState({ dataArray: newDataArray });
            }
            this.setState({
              isConfigDirty: true,
            });
          }
        }}
        onDragLeave={() => {
          if (sortableInfo.id !== this.state.dragElement.id) {
            if (this.state.lock && sortableInfo.id === this.state.dataArray[this.state.dataArray.length - 1]) {
              const newDataArray = this.state.dataArray.filter(item => item.id !== this.state.dragElement.id);
              newDataArray.push(this.state.dragElement);
              this.setState({
                lock: false,
              }, () => {
                this.setState({
                  dataArray: newDataArray,
                });
              });
            } else {
              this.setState({
                lock: true,
              });
            }
          }
        }}
      >
          <div>你的东西</div>
      </div>
    );
  }


相关文章

  • react.js 拖拽

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

  • React实现拖拽排序

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

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

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

  • React 拖拽排序

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

  • react事件机制和原生dom事件机制之男女有别

    今天遇到这么一个问题: 我们在实现列表拖拽排序时使用了react-sortable-hoc这个库,确实很好用,利用...

  • React 实现组件拖拽功能

    ##实现React组件的拖拽功能 HTML5原生支持拖拽功能,没有看过相关文档,恰好自己想实现一下React组件...

  • React Dnd 实现横向和纵向拖拽排序

    接昨天说到的 React Dnd 基本拖放功能实现及 API 整理 我们试着做一个简单的需求,拖拽排序。 原理 用...

  • react项目中使用react-dnd实现列表的拖拽排序

    现在有一个新需求就是需要对一个列表,实现拖拽排序的功能,要实现的效果如下图:​ 可以通过 react-dnd 或者...

  • POS-2017

    拖拽排序功能 实现方法: 使用jquery的Sortable功能可以实现拖拽功能 index页面 html部分 商...

  • React Nativie 拖拽排序

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

网友评论

      本文标题:React实现拖拽排序

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