首页 > 其他分享 >记录拖动排序

记录拖动排序

时间:2023-07-09 16:01:16浏览次数:63  
标签:index const monitor 记录 拖动 restProps props 排序

最近项目中要做一个拖动排序功能,首先想到的是之前项目中用过的antd自带的tree和table的拖动排序,但是只能在对应的组建里使用。这里用的是自定义组件,随意拖动排序,所以记录一下实现流程

  1. react-dnd antd组件的拖动排序都是用的这个库,使用比较灵活,但是要配置的东西比较多,需求复杂时使用这个库;
    class BodyRow extends React.Component {
      render() {
        const { isOver, connectDragSource, connectDropTarget, moveRow, ...restProps } = this.props;
        const style = { ...restProps.style, cursor: 'move' };
    
        let { className } = restProps;
        if (isOver) {
          if (restProps.index > dragingIndex) {
            className += ' drop-over-downward';
          }
          if (restProps.index < dragingIndex) {
            className += ' drop-over-upward';
          }
        }
        return connectDragSource(
          connectDropTarget(<tr {...restProps} className={className} style={style} />),
        );
      }
    }
    const rowSource = {
      beginDrag(props) {
        dragingIndex = props.index;
        return {
          index: props.index,
        };
      },
    };
    const rowTarget = {
      drop(props, monitor) {
        const dragIndex = monitor.getItem().index;
        const hoverIndex = props.index;
        // Don't replace items with themselves
        if (dragIndex === hoverIndex) {
          return;
        }
        // Time to actually perform the action
        props.moveRow(dragIndex, hoverIndex);
        // Note: we're mutating the monitor item here!
        // Generally it's better to avoid mutations,
        // but it's good here for the sake of performance
        // to avoid expensive index searches.
        monitor.getItem().index = hoverIndex;
      },
    };
    const DragableBodyRow = DropTarget('row', rowTarget, (connect, monitor) => ({
      connectDropTarget: connect.dropTarget(),
      isOver: monitor.isOver(),
    }))(
      DragSource('row', rowSource, connect => ({
        connectDragSource: connect.dragSource(),
      }))(BodyRow),
    );
    
    <DndProvider backend={HTML5Backend}>
      <Table
        columns={columns}
        dataSource={this.state.data}
        components={this.components}
        onRow={(record, index) => ({
          index,
          moveRow: this.moveRow,
        })}
      />
    </DndProvider>
    
  2. react-beautiful-dnd 在项目中看到引用了这个库,使用起来也不算复杂,就试着用了这个库,不过只支持水平或垂直拖动,一行或者一列元素时可以使用,可惜这个需求时两行多列元素,也没办法用;
    <DragDropContext onDragEnd={this.onDragEnd}>
      <Droppable droppableId='phone-droppable'>
        {droppableProvided => (
          <div ref={droppableProvided.innerRef} {...droppableProvided.droppableProps}>
            {this.state.phoneImages.map((image, index) => (
              <Draggable key={image||'upload'} draggableId={image||'upload'} index={index}>
                {(provided, snapshot) => (
                  <div
                    ref={provided.innerRef}
                    {...provided.draggableProps}
                    {...provided.dragHandleProps}
                    style={{
                      ...provided.draggableProps.style,
                      opacity: snapshot.isDragging ? 0.8 : 1,
                      display: 'inline-block'
                    }}
                  >
                    <img src={img}/>
                  </div>
                )}
              </Draggable>
            ))}
            {droppableProvided.placeholder}
          </div>
        )}
      </Droppable>
    </DragDropContext>
    
  3. react-sortable-hoc 最后在网上搜索的时候,又看到这个库,使用起来比较简单,使用SortableList包裹要拖拽元素的容器,SortableElement包裹要拖拽的子元素,设置容器拖拽方向axis={'xy'}即可使grid布局的多个元素支持水平和竖直方向拖动排序;
    const SortableItem = SortableElement(({children}) => (
      <div>{children}</div>
    ));
    const SortableList = SortableContainer(({children}) => {
      return (
        <div style={{display: 'grid', gridTemplateRows: '117px 117px', gridTemplateColumns: '120px 120px 120px 120px'}}>
          {children}
        </div>
      );
    });
    
    <SortableList onSortEnd={this.onPadSortEnd} helperClass={Styles.sortableHelper} axis={'xy'}>
      {this.state.padImages.map((image, index) => (
        <SortableItem key={`pad-item-${index}`} index={index} className={Styles.sortableItem}>
          <img src={img}/>
        </SortableItem>
      ))}
    </SortableList>
    

好久没更新博客了,最近工作比较忙,差不多每天都要加班,中间有经历搬家,没时间坐下来总结学到的东西。工作的时候因为这块花费了一些时间,想到可能别人也会遇到类似问题,所以就记录下来了

标签:index,const,monitor,记录,拖动,restProps,props,排序
From: https://www.cnblogs.com/shenyuiOS/p/17538853.html

相关文章

  • docker 常用记录2023
    IDEA连接虚拟机(Ubuntu)的docker的最好办法(开放2375端口号).我这里用的Ubuntu,1、打开终端输入"sudovim/lib/systemd/system/docker.service"2.在sock后面,添加-Htcp://0.0.0.0:2375如上图所示.按下键盘Esc键输入wq保存退出.3.然后输入systemctldaemon-reload,重新加......
  • 记录一个打印内存的日志函数
    在调试代码的时候,经常需要dump一段内存,有时候不得不自己动手写一个函数。现在先记录一个简单版本的内存打印函数。constchar*hexstr="0123456789ABCDEF";voiddump(intlevel,constchar*tag,constuint8_t*data,uint32_tlength){#define_CNT_PER_LINE(1<<4)......
  • CTFer成长记录——CTF之Misc专题·base32
    一、题目链接https://ctf.show/challenges#萌新隐写5-112二、题意分析    打开后是一张神奇的txt文件,一开始我们可以尝试将文件丢入winhex中,找找有没有信息。这个题就是通过winhex中的信息,获取到一串密文,根据密文的特征最后解出flag。三、解法步骤  用winhex打开......
  • 计算机网络自顶而下第一章笔记记录
    计算机网络节点主机及其上运行的应用程序(能接入互联网的任何终端)(端点)路由器,交换机等网络交换设备。(其中,路由器与交换机的工作层次不同,路由器在网络层工作,交换机在链路层工作)边 通信链路(按接入设备的不同)接入网链路,主机连接到互联网的链路(只要有端点即可)主干链路:路由器......
  • CSAPP-Data Lab 思路记录
    >gcc-O1-Wall-m32-lm-obtestbits.cbtest.cdecl.ctests.c>Infileincludedfrombtest.c:16:0:>/usr/include/stdio.h:27:10:fatalerror:bits/libc-header-start.h:Nosuchfileordirectory>#include<bits/libc-header-start.h>>......
  • Java版归并排序 演示代码(带注释)
    Code:importjava.util.Arrays;/***归并排序*/publicclassMergeSort{/***私有化*/privateMergeSort(){}/***归并排序的sort方法*@paramarr待排序数组*@param<E>可比较的元素*/publicstatic<Eex......
  • 排序 sorted
    l=sorted([36,5,-12,9,-21])print(l)'''[-21,-12,5,9,36]'''l=sorted([36,5,-12,9,-21],key=abs)print(l)'''[5,9,-12,-21,36]''' #按照元祖里的key的name首字母lis=[('Bob',......
  • 暑期记录2
    7月3这周我就开始了java的学习,首先我根据老师的要求下载并安装了编程软件eclipse,但是下载安装完成之后还需要下载jdk,修改环境配置,我通过查阅资料,大约花了1个小时才终于算是彻底完成了java编程的前期工作,面对一个全新的编程软件,开始是比较迷茫的,但通过上网查阅相关资料,对软件以及j......
  • js 对文字排序和对数字排序
    1、对文字排序 <html><body><scripttype="text/javascript">vararr=newArray(6)arr[0]="George"arr[1]="John"arr[2]="Thomas"arr[3]="James"arr[4]="Adrew"arr......
  • 记录--在高德地图实现卷帘效果
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助介绍今天介绍一个非常简单的入门级小案例,就是地图的卷帘效果实现,各大地图引擎供应商都有相关示例,很奇怪高德居然没有,我看了下文档发现其实也是可以简单实现的,演示代码放到文末。本文用到了图层掩模,即图层遮罩,让图......