react實現記錄拖動排序

最近項目中要做一個拖動排序功能,首先想到的是之前項目中用過的antd自帶的tree和table的拖動排序,但是只能在對應的組建里使用。這里用的是自定義組件,隨意拖動排序,所以記錄一

最近項目中要做一個拖動排序功能,首先想到的是之前項目中用過的antd自帶的tree和table的拖動排序,但是只能在對應的組建里使用。這里用的是自定義組件,隨意拖動排序,所以記錄一下實現流程

  • 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>
    
  • 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>
    
  • 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>
    

好久沒更新博客了,最近工作比較忙,差不多每天都要加班,中間有經歷搬家,沒時間坐下來總結學到的東西。工作的時候因為這塊花費了一些時間,想到可能別人也會遇到類似問題,所以就記錄下來了

到此這篇關于react實現記錄拖動排序的文章就介紹到這了,更多相關react記錄拖動排序內容請搜索技圈網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持技圈網!

【文章原創作者:韓國服務器租用 http://www.558idc.com/lg.html 復制請保留原URL】
聲明:所有內容來自互聯網搜索結果,不保證100%準確性,僅供參考。如若本站內容侵犯了原著者的合法權益,可聯系我們進行處理。
發表評論
更多 網友評論0 條評論)
暫無評論

返回頂部

主站蜘蛛池模板: 添bbb免费观看高清视频| 97免费人妻无码视频| 色综合久久综合网| 日本按摩xxxxx高清| 国产大秀视频在线一区二区| 亚洲av无码乱码精品国产| 2021国产精品自产拍在线观看| 毛片试看120秒| 国产萌白酱在线观看| 亚洲欧美日韩人成在线播放| 91精品国产9l久久久久| 欧美激情一区二区三区蜜桃视频 | 女人张开腿让男人桶个爽| 免费看男女做好爽好硬视频| 一区二区三区四区电影视频在线观看| 精品国产一区二区三区免费| 好男人好资源在线| 亚洲视频在线不卡| 亚洲黄在线观看| 99久久超碰中文字幕伊人| 欧美粗大猛烈老熟妇| 国产精品R级最新在线观看| 亚洲Aⅴ在线无码播放毛片一线天 亚洲A∨无码一区二区三区 | 中文字幕免费在线观看动作大片 | 国产精品爽爽va在线观看无码| 亚洲成人aaa| 国产精品俺来也在线观看| 日本欧美韩国专区| 啊灬啊灬啊灬快好深视频在线| 一区二区三区日韩精品| 波多野结衣中文字幕一区二区三区| 国产鲁鲁视频在线观看| 亚洲av熟妇高潮30p| 野花视频www高清| 性一交一乱一伦一色一情| 伊人久久大香线蕉久久婷婷| 69pao强力打造免费高清| 日韩精品久久久肉伦网站| 国产一区二区精品久久岳| www320999com| 欧美成视频无需播放器|