翼度科技»论坛 编程开发 JavaScript 查看内容

react拖拽组件react-sortable-hoc的使用

7

主题

7

帖子

21

积分

新手上路

Rank: 1

积分
21
使用react-sortable-hoc实现拖拽
如图:
  1. 提示:下面案例可供参考
复制代码

1.文件1

代码如下(示例):文件名称:./dragcomponents
  1. import * as React from 'react'
  2. import {
  3.     sortableContainer,
  4.     sortableElement,
  5.     sortableHandle,
  6. } from "react-sortable-hoc"; // 拖拽的关键组件

  7. const Sortable: React.FC<any> = (props) => {
  8.     const { dataSource = [], ComSortItem, sortEnd } = props;
  9.     // 拖拽时原列表替换
  10.     function arrayMoveMutable(array, fromIndex, toIndex) {
  11.         const startIndex = fromIndex < 0 ? array.length + fromIndex : fromIndex;
  12.         if (startIndex >= 0 && startIndex < array.length) {
  13.             const endIndex = toIndex < 0 ? array.length + toIndex : toIndex;
  14.             const [item] = array.splice(fromIndex, 1);
  15.             array.splice(endIndex, 0, item);
  16.         }
  17.     }

  18.     // 拖拽时返回新数组
  19.     function arrayMoveImmutable(array, fromIndex, toIndex) {
  20.         array = [...array];
  21.         arrayMoveMutable(array, fromIndex, toIndex);
  22.         return array;
  23.     }

  24.     // 拖拽容器
  25.     const SortableContainer = sortableContainer(({ children }) => {
  26.         return <div>{children}</div>;
  27.     });

  28.     // 拖拽ico
  29.     const DragHandle = sortableHandle((value1, sortIndex1) => (
  30.         <div id='ListItem' className='ListItem' >
  31.             <div className="ChildCom">
  32.                 <ComSortItem data={value1} index={sortIndex1} updateData={updateData} />
  33.             </div>
  34.         </div>
  35.     ));
  36.     function handleDelete(index) {
  37.         const List = [...dataSource];
  38.         List.splice(index, 1)
  39.         sortEnd(List);
  40.     }
  41.     // 数据更新
  42.     function updateData(val, index) {
  43.         const List = [...dataSource];

  44.         List[index] = val;
  45.         sortEnd(List);
  46.     }
  47.     // 拖拽体
  48.     const SortableItem = sortableElement(({ value, sortIndex }) => {
  49.         return (
  50.             // <div id='ListItem' className='ListItem' >
  51.             //     <DragHandle value1={value} sortIndex1={sortIndex} />
  52.             // </div>
  53.             <DragHandle valuedata={value} sortIndexdata={sortIndex} />
  54.         );
  55.     });

  56.     // 拖拽后回调
  57.     const onSortEnd = ({ oldIndex, newIndex }) => {
  58.         const List = arrayMoveImmutable(dataSource, oldIndex, newIndex);
  59.         sortEnd(List);
  60.     };
  61.     return (
  62.         <>
  63.             <SortableContainer onSortEnd={onSortEnd} useDragHandle helperClass="row-dragging-item">
  64.                 {dataSource.length > 0 &&
  65.                     dataSource.map((value, index) => (
  66.                         <SortableItem
  67.                             key={`sortable-item-${index}`}
  68.                             index={index}
  69.                             value={value}
  70.                             sortIndex={index}
  71.                         />
  72.                     ))}
  73.             </SortableContainer>
  74.         </>
  75.     );
  76. }

  77. export default Sortable;
复制代码
2.文件2

代码如下(示例):文件名称’./usedrag’
  1. import * as React from 'react'
  2. import { Checkbox } from 'antd'

  3. import Sortable from './dragcomponents'
  4. import './index.scss'
  5. const _ = require('lodash')
  6. import store from './store'
  7. import { SAVE_RENDER_ALL_DATA } from './actionType'
  8. const Usedrag: React.FC<any> = (props) => {
  9.     const { state, dispatch } = React.useContext(store);
  10.     // 自定义拖拽体
  11.     const {upDateRenderData} = props
  12.     const showdata ={...props.renderData}
  13.     function AddForm(showdata) {
  14.         return (
  15.             < div className='ItemBox'>
  16.                
  17.                 <div className='name'><span className="icon iconfont iconyidongshu"></span>{showdata.data.valuedata.fieldName}</div>
  18.                 <div className='Opt'>
  19.                     <span>控件标签显示名称<span>{showdata.data.valuedata.labelName}</span></span>
  20.                     <span>所占列宽<span>{showdata.data.valuedata.span}</span></span>
  21.                     {/* <Checkbox onChange={changeChecked} checked={checked} ></Checkbox> */}
  22.                 </div>
  23.             </div>
  24.         )
  25.     }

  26.     const updateSource = (val) => {
  27.         const arrdata: any = _.cloneDeep(props.renderData)
  28.         const arr: any = _.cloneDeep(val)
  29.         if(JSON.stringify(arrdata) !== JSON.stringify(arr)){
  30.             for (let i = 0; i <= arr.length - 1; i++) {
  31.                 arr[i].edit = 1;
  32.             }
  33.         }
  34.         // upDateRenderData(arr)
  35.         dispatch({
  36.             type: SAVE_RENDER_ALL_DATA,
  37.             value: arr
  38.         })
  39.     }

  40.     return (
  41.         <div className='RightBox' >
  42.             <div className='item-con' style={{ overflow: 'auto' }}>
  43.                 <Sortable
  44.                     className='sortable'
  45.                     dataSource={...props.renderData}
  46.                     ComSortItem={(p) => <AddForm {...p} />}
  47.                     sortEnd={(val) => {
  48.                         updateSource(val)
  49.                     }}
  50.                 />
  51.             </div>
  52.         </div>
  53.     );
  54. };


  55. export default Usedrag
复制代码
3.使用

代码如下(示例):
  1. import Usedrag from './usedrag';
  2. <Usedrag renderData={renderData}/>
复制代码
到此这篇关于react拖拽组件react-sortable-hoc的使用的文章就介绍到这了,更多相关react拖拽组件react-sortable-hoc内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

来源:https://www.jb51.net/article/276314.htm
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具