react-dnd实现列表的拖拽排序

1.先安装依赖

github地址:react-dnd

npm i react-dnd

npm i react-dnd-html5-backend

2.创建 DndProvider 组件

import { HTML5Backend } from 'react-dnd-html5-backend'
import { DndProvider } from 'react-dnd'

export default class YourApp {
  render() {
    return (
      <DndProvider backend={HTML5Backend}>
        /* 你的拖动和放置组件/应用 */
      </DndProvider>
    )
  }
}

3.创建放置组件

使用useDrag、useDrop

import React from 'react';
import { useDrag, useDrop } from 'react-dnd';
import { message } from 'antd';
import { cloneDeep } from 'lodash';

interface IProps {
  index: any
  item: any
  changeSelectItem: any
  selectItem: any
}

export default React.memo(function DragableItem({ index, item, changeSelectItem, selectItem }: IProps) {
  const moveItem = (dragIndex, dropIndex) => {
    let cloneSelectItem = cloneDeep(selectItem);
    if (dragIndex > dropIndex) {
      cloneSelectItem.splice(dragIndex, 1); // 删除移动的
      cloneSelectItem.splice(dropIndex, 0, selectItem[dragIndex]); // 插入
    } else {
      cloneSelectItem.splice(dropIndex + 1, 0, selectItem[dragIndex]); // 插入
      cloneSelectItem.splice(dragIndex, 1); // 删除移动的
    }
    if (changeSelectItem) {
      changeSelectItem(cloneSelectItem);
    }
  };

  const type = 'dragableItem';
  const ref = React.useRef(null);
  const [{ isOver, dropClassName }, drop] = useDrop({
    accept: type,
    collect: monitor => {
      const { index: dragIndex } = monitor.getItem() || {};
      if (dragIndex === index) {
        return {};
      }
      return {
        isOver: monitor.isOver(),
        dropClassName: dragIndex < index ? ' drop-over-downward' : ' drop-over-upward',
      };
    },
    drop: (item: any) => {
      moveItem(item.index, index);
    },
  });
  
  const [, drag] = useDrag({
    item: { ...item, type, index,id: item.key },
    collect: monitor => ({
      isDragging: monitor.isDragging(),
    }),
  });
  drop(drag(ref));
  return (
    <span ref={ref} title={item.title}>{item.title}</span>
  );
});

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值