用法简介
- 基于react的拖拽功能,有这么几个比较流行的库:
- react-dnd
- react-beautiful-dnd
- dnd-kit
- react-sortable-hoc
-
介绍react-sortable-hoc 用法
下载==>(项目中安装 react-sorting-hoc 以及 array-move,后者是用来实现数组移动。)
- yarn add react-sortable-hoc array-move
- npm add react-sortable-hoc array-move
- 项目页面中引入包
- import {sortableContainer, sortableElement} from ‘react-sortable-hoc’;
- import arrayMove from ‘array-move’;
- 基本概念
- SortableContainer 拖拽排序的容器
- SortableElement 拖拽排序的元素
- 用法
- 在 render 里写
```javascript
- 在 render 里写
```javascript
// items里存放需要便利拖拽的数组 // distance属性 作用:(设置触发排序之前要拖动的最小距离) eg:可以设置为10px
目的:防止拖拽组件里的onClick时间不能触发```javascript// 列表拖动onSortEnd = ({oldIndex, newIndex}) => {const {sendMsgList} = enterpriseMicroSOP.addTeskNode;if (oldIndex !== newIndex) {const newData = arrayMove([].concat(sendMsgList), oldIndex, newIndex).filter(el => !!el);enterpriseMicroSOP.addTeskNode.sendMsgList = JSON.parse(JSON.stringify(newData));}};
const SortableContainer = sortableContainer(({items}) => {return (<div className={style.Timeline_info} ref={this.listRef} onScrollCapture={() => this.handleScroll()}>{items.map((item_, index_) => {if (item_.sendType == 0) {return <RenderTextInfo key={`item-${index_}`} index={index_} index_={index_} item_={item_} disabled={false} />;}})}</div>);});
需要创建一个ref节点 目的是为了拖拽滚动的时候,滚动位置不变
this.listRef = React.createRef();
componentDidUpdate() {// 滚动位置不变this.listRef.current.scrollTop = this.scrollTop;}
需要排序的元素(也要写在render里面)
// 渲染文本样式const RenderTextInfo = sortableElement(({item_, index_}) => {return (<div className={style.list_template} key={index_}><div className={style.left}><div className={style.list_template_left}><span>{index_ + 1}</span></div><div className={style.text_info}>{item_.sendTypeMessage}</div></div></div>);});
介绍react-beautiful-dnd 用法
- 下载
- yarn add react-beautiful-dnd
- npm install react-beautiful-dnd —save
- 项目页面中引入包
- import {DragDropContext, Droppable, Draggable} from ‘react-beautiful-dnd’;
- 基本用法
- DragDropContext : 用于包装拖拽根组件,Draggable和Droppable都需要包裹在DragDropContext内
- Draggable 用于包装你需要拖动的组件,使组件能够被拖拽(make it draggable)
- Droppable 用于包装接收拖拽元素的组件,使组件能够放置(dropped on it)
return (<DragDropContext onDragEnd={this.handleDragEnd}><Droppable droppableId="droppable">{(provided, snapshot) => (<div {...provided.droppableProps} ref={provided.innerRef} className={style.drop_col_container} key={'droppable'}>{typeList.map((item, index) => {if (this.props.isCustomerGroup) {if (item.typeKey == 'file' || item.typeKey == 'miniprogram') return;}return (<Draggable key={item.id} draggableId={String(item.id)} index={index}>{(provided, snapshot) => (<divref={provided.innerRef}{...provided.draggableProps}{...provided.dragHandleProps}key={index}className={`${style.drop_item} ${this.state.activeKey == item.typeKey ? style.drop_item_selected : ''}`}><div className={style.drop_col}><div className="drop"></div><TextAreaid={'SortName'}className="SortName"onChange={e => {this.handleInputChange(e, item.typeKey);}}value={item.typeName}showCountplaceholder="请输入名称"maxLength={10}rows={1}/></div></div>)}</Draggable>);})}</div>)}</Droppable></DragDropContext>);
handleDragEnd = result => {const {typeList} = this.state;if (!result.source || !result.destination) return;const sourceIndex = result.source.index; // 被拖动元素位置const endIndex = result.destination.index; // 拖动的位置const list = this.swapArr(typeList, sourceIndex, endIndex);this.setState({typeList: list});};
// 排序swapArr(arr, index1, index2) {if (index1 > index2) {arr.splice(index2, 0, arr[index1]);arr.splice(index1 + 1, 1);} else {arr.splice(index2 + 1, 0, arr[index1]);arr.splice(index1, 1);}return arr;}
