不多说,直接上代码

react-dnd 需要react版本 > 16.6 ,貌似与react.memo方法有关

import React from 'react'// DragDropContext 类似React的Context// DragSource 高阶组件 包裹被拖的元素// DropTarget 高阶组件 包裹被释放的元素 import {DragDropContext, DragSource, DropTarget} from 'react-dnd';// HTML5Backend  这个库是必须的,类似于React的合成事件// 解决浏览器差异,抽象事件操作为可以处理的stateimport HTML5Backend from 'react-dnd-html5-backend';import "./index.css"const data = [  {id: 10, text: '1'},  {id: 11, text: '2'},  {id: 12, text: '3'},  {id: 13, text: '4'},  {id: 14, text: '5'}]const datas = {  data}class Item extends React.Component {  constructor(props) {    super(props)  }  render() {    const {connectDragSource, connectDropTarget, move, ...restProps} = this.props;    return (      connectDragSource(        connectDropTarget(          <div {...restProps}>{restProps.text}</div>        )      )    )  }}const dragNode = DragSource('li', {  beginDrag(props, monitor, component) {    return {      index: props.index,    };  },}, connect => ({  connectDragSource: connect.dragSource(),}))(Item);const DropNode = DropTarget('li', {    drop(props, monitor) {      const dragIndex = monitor.getItem().index;      const hoverIndex = props.index;      if (dragIndex === hoverIndex) return;      props.move(dragIndex, hoverIndex);      //monitor.getItem().index = hoverIndex;    }  }, function (connect) {    return {      connectDropTarget: connect.dropTarget()    }  })(dragNode)class Demo extends React.Component {  state = datas;  moveRow = (start, end) => {    let {data} = this.state;    let temp = data[start]    data[start] = data[end];    data[end] = temp;    this.setState({data})  }  render() {    return (      <div className='move'>        {          this.state.data.map( (item, index) => {            const prop = {              move: this.moveRow,              key: item.id,              id: item.id,              text: item.text,              index: index            }            return <DropNode {...prop}/>          })        }      </div>    )  }}export default DragDropContext(HTML5Backend)(Demo);