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

2023-10-27

react 拖拽组件 react-sortable-hoc

使用react-sortable-hoc实现拖拽

如图:
在这里插入图片描述

提示:下面案例可供参考

1.文件1

代码如下(示例):文件名称:./dragcomponents

import * as React from 'react'
import {
    sortableContainer,
    sortableElement,
    sortableHandle,
} from "react-sortable-hoc"; // 拖拽的关键组件

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

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

    // 拖拽容器
    const SortableContainer = sortableContainer(({ children }) => {
        return <div>{children}</div>;
    });

    // 拖拽ico
    const DragHandle = sortableHandle((value1, sortIndex1) => (
        <div id='ListItem' className='ListItem' >
            <div className="ChildCom">
                <ComSortItem data={value1} index={sortIndex1} updateData={updateData} />
            </div>
        </div>
    ));
    function handleDelete(index) {
        const List = [...dataSource];
        List.splice(index, 1)
        sortEnd(List);
    }
    // 数据更新
    function updateData(val, index) {
        const List = [...dataSource];

        List[index] = val;
        sortEnd(List);
    }
    // 拖拽体
    const SortableItem = sortableElement(({ value, sortIndex }) => {
        return (
            // <div id='ListItem' className='ListItem' >
            //     <DragHandle value1={value} sortIndex1={sortIndex} />
            // </div>
            <DragHandle valuedata={value} sortIndexdata={sortIndex} />
        );
    });

    // 拖拽后回调
    const onSortEnd = ({ oldIndex, newIndex }) => {
        const List = arrayMoveImmutable(dataSource, oldIndex, newIndex);
        sortEnd(List);
    };
    return (
        <>
            <SortableContainer onSortEnd={onSortEnd} useDragHandle helperClass="row-dragging-item">
                {dataSource.length > 0 &&
                    dataSource.map((value, index) => (
                        <SortableItem
                            key={`sortable-item-${index}`}
                            index={index}
                            value={value}
                            sortIndex={index}
                        />
                    ))}
            </SortableContainer>
        </>
    );
}

export default Sortable;

2.文件2

代码如下(示例):文件名称’./usedrag’

import * as React from 'react'
import { Checkbox } from 'antd'

import Sortable from './dragcomponents'
import './index.scss'
const _ = require('lodash')
import store from './store'
import { SAVE_RENDER_ALL_DATA } from './actionType'
const Usedrag: React.FC<any> = (props) => {
    const { state, dispatch } = React.useContext(store);
    // 自定义拖拽体
    const {upDateRenderData} = props
    const showdata ={...props.renderData}
    function AddForm(showdata) {
        return (
            < div className='ItemBox'>
                
                <div className='name'><span className="icon iconfont iconyidongshu"></span>{showdata.data.valuedata.fieldName}</div>
                <div className='Opt'>
                    <span>控件标签显示名称<span>{showdata.data.valuedata.labelName}</span></span>
                    <span>所占列宽<span>{showdata.data.valuedata.span}</span></span>
                    {/* <Checkbox onChange={changeChecked} checked={checked} ></Checkbox> */}
                </div>
            </div>
        )
    }

    const updateSource = (val) => {
        const arrdata: any = _.cloneDeep(props.renderData)
        const arr: any = _.cloneDeep(val)
        if(JSON.stringify(arrdata) !== JSON.stringify(arr)){
            for (let i = 0; i <= arr.length - 1; i++) {
                arr[i].edit = 1;
            }
        }
        // upDateRenderData(arr)
        dispatch({
            type: SAVE_RENDER_ALL_DATA,
            value: arr
        })
    }

    return (
        <div className='RightBox' >
            <div className='item-con' style={{ overflow: 'auto' }}>
                <Sortable
                    className='sortable'
                    dataSource={...props.renderData}
                    ComSortItem={(p) => <AddForm {...p} />}
                    sortEnd={(val) => {
                        updateSource(val)
                    }}
                />
            </div>
        </div>
    );
};


export default Usedrag

3.使用

代码如下(示例):

import Usedrag from './usedrag';
<Usedrag renderData={renderData}/>

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

react 拖拽组件 react-sortable-hoc的使用 的相关文章

  • TypeError: props.render 不是一个函数(React hook 形式)

    我将方法作为我用react hook form制作的形式的道具传递 当从react hook form添加控制器时 它给了我 TypeError props render不是一个函数 我在网上找不到任何解决方案 因此感谢任何帮助 impor
  • jQuery AJAX 调用 Java 方法

    使用 jQuery AJAX 我们可以调用特定的 JAVA 方法 例如从 Action 类 该 Java 方法返回的数据将用于填充一些 HTML 代码 请告诉我是否可以使用 jQuery 轻松完成此操作 就像在 DWR 中一样 此外 对于
  • 检查 JavaScript 字符串是否为 URL

    JavaScript 有没有办法检查字符串是否是 URL 正则表达式被排除在外 因为 URL 很可能是这样写的stackoverflow 也就是说它可能没有 com www or http 如果你想检查一个字符串是否是有效的 HTTP UR
  • 如何防止 Iframe 在与浏览器交互后弄乱浏览器的历史记录?

    因此 就我而言 我使用 Iframe 将 Grafana 附加到我的页面 这为我提供了漂亮且易于使用的图表 可以注意到 每次在图表上进行放大或缩小 使用鼠标单击 交互后 Grafana 的 Iframe 都会在我的 Angular 页面上触
  • Node.js:如何在检索数据(块)时关闭响应/请求

    我正在用 node js 构建一个应用程序 它加载多个页面并分析内容 因为 node js 发送块 所以我可以分析这些块 如果一个块包含例如索引 nofollow 我想关闭该连接并继续其余部分 var host example com to
  • 除了更改标题之外,如何在 Firefox 中强制另存为对话框?

    有没有办法在 ff 中强制打开 www example com example pdf 的另存为对话框 我无法更改标题 如果您可以将文件以 Base64 格式输出到客户端 则可以使用 data uri 进行下载 location href
  • JavaScript 重定向到新窗口

    我有以下代码 它根据下拉列表的值重定向到页面 我如何使其在新窗口中打开 function goto form var index form select selectedIndex if form select options index
  • Jquery/Javascript 上传和下载文件,无需后端

    是否可以在没有后端服务器的情况下在 JavaScript 函数中下载和上传文件 我需要导出和导入由 JavaScript 函数生成的 XML 我想创建按钮 保存 xml 来保存文件 但我不知道是否可行 另一方面 我希望将 XML 文件直接上
  • 跟踪用户何时点击浏览器上的后退按钮

    是否可以检测用户何时单击浏览器的后退按钮 我有一个 Ajax 应用程序 如果我可以检测到用户何时单击后退按钮 我可以显示适当的数据 任何使用 PHP JavaScript 的解决方案都是优选的 任何语言的解决方案都可以 只需要我可以翻译成
  • 将div设置为隐藏,延时后可见

    我试图在 X 时间后 也许甚至在随机时间之后 但现在我们只做固定时间 在黑色背景上出现一个黄色方块 function initialSetup if document getElementById yellow null document
  • 在 webpack 2.x 中使用 autoprefixer 和 postcss

    如何使用autoprefixer使用 webpack 2 x 以前 它曾经是这样的 module loaders test scss loader style css sass postcss postcss gt return autop
  • Babel 7 Jest Core JS“TypeError:wks不是函数”

    将我的项目升级到 Babel 7 后 通过 Jest 运行测试会抛出以下错误 测试在 Babel 6 中运行没有任何问题 但在 Babel 7 中失败并出现以下错误 TypeError wks is not a function at Ob
  • Firefox 书签探索未超过 Javascript 的第一级

    我已经编写了一些代码来探索我的 Firefox 书签 但我只获得了第一级书签 即我没有获得文件夹中的链接 e g 搜索引擎 雅虎网站 谷歌网站 在此示例中 我只能访问 Search engines 和 google com 不能访问 yah
  • Electron - 为什么在关闭事件时将 BrowserWindow 实例设置为 null

    The 电子文档 https electronjs org docs api browser window 提供以下代码示例来创建新窗口 const BrowserWindow require electron let win new Br
  • Javascript 数组到 VBScript

    我有一个使用 Javascript 构建的对象数组 我需要使用 VBScript 读取它 如下例所示 我找不到在 VbScript 代码中循环遍历数组的方法myArray object 这个例子是我的问题的简化 我无法更改页面的默认语言 这
  • 为什么在 Internet Explorer 中访问 localStorage 对象会引发错误?

    我正在解决一个客户端问题 Modernizr 意外地没有检测到对localStorageInternet Explorer 9 中的对象 我的页面正确使用 HTML 5 文档类型 并且开发人员工具报告该页面具有 IE9 的浏览器模式和 IE
  • 如何在类似控制台的环境中运行 JavaScript?

    我正在尝试遵循这里的示例 http eloquentjavascript net chapter2 html http eloquentjavascript net chapter2 html and print blah 在浏览器中运行时
  • 有没有办法阻止 prettier / prettier-now 将函数参数分解为新行

    当使用 prettier prettier now 在保存时进行格式化时 当一个函数包装另一个函数时 它会中断到一个新行 我想知道是否有办法阻止这种行为 例如 期望的输出 app get campgrounds id catchAsync
  • 条件在反应本机生产中失败,但在开发中有效

    我创建了一个反应本机应用程序 我需要通过它进行比较 如果属实 就会执行死刑 问题是 该条件适用于 React Native 开发模式 而不适用于 React Native 生产版本 我使用 firebase 作为数据库 也使用 redux
  • JQuery 图像上传不适用于未来的活动

    我希望我的用户可以通过帖子上传图像 因此 每个回复表单都有一个上传表单 用户可以通过单击上传按钮上传图像 然后单击提交来提交帖子 现在我的上传表单可以上传第一个回复的图像 但第二个回复的上传不起作用 我的提交过程 Ajax 在 php 提交

随机推荐

  • 基于STM32使用超声波HC-SR04模块

    写在前面注意的几点 1 HC SR04模块必须使用5V供电 不能是3 3V 2 若单是测距 无需使用中断 3 Echo和Trig两个引脚可以任意接可用的GPIO 和定时器无关 说一下超声波的工作原理 单片机给Trig引脚一个最少10us的高
  • python matplotlib 坐标轴打断

    想要绘制出如下类型坐标轴断开的图 matplotlib中并没有直接可用的API 但是官方给出了一个demo broken axis py 大概说下思路 画出两个共享X轴 完全相同的图 下图取消上边界 下图取消下边界 然后再使用plot画两组
  • Python3 ThreadPoolExecutor--线程池

    1 线程池创建 def init self max workers None thread name prefix initializer None initargs max workers 设置线程池中最多能同时运行的线程数目 threa
  • mysql-跨库联合查询

    目前微服务很火 但是就存在问题 服务拆分 数据库也进行拆分 mysql如果A数据库数据需要联合查询B数据库 应该如何实现呢 sqlserver 可以使用dblink 具体不做说明 查资料即可 着重讲解mysql 1 同实例不同库 1 gt
  • 【数字图像处理】四.MFC对话框绘制灰度直方图

    本文主要讲述基于VC 6 0 MFC图像处理的应用知识 主要结合自己大三所学课程 数字图像处理 及课件进行回忆讲解 主要通过MFC单文档视图实现点击弹出对话框绘制BMP图片的灰度直方图 再获取平均灰度 中指灰度和标准差等值 文章比较详细基础
  • slowfast解读:facebook用于机器视觉分析视频理解的双模CNNk

    检测并归类图像中的物体是最广为人知的一个计算机视觉任务 随着ImageNet数据集挑战而更加流行 不过还有一个令人恼火的问题有待解决 视频理解 视频理解指的是对视频片段进行分析并进行解读 虽然有一些最新的进展 现代算法还远远达不到人类的理解
  • Android读取联系人数据库

    联系人表详解 contacts content com android contacts contacts ContactsContract Contacts CONTENT URI 附注 用户的联系人表 每个联系人占一行 不包括用户已经删
  • mongodb用户权限管理-001

    创建自定义用户 1 添加用于全局管理的角色 db createUser user root pwd password roles role root db admin 2 添加管理某一数据库的角色 可以根据需要为其添加权限 也可以之后根据需
  • JavaWeb基础3——Maven基础&MyBatis

    导航 黑马Java笔记 踩坑汇总 JavaSE JavaWeb SSM SpringBoot 瑞吉外卖 SpringCloud SpringCloudAlibaba 黑马旅游 谷粒商城 Maven高级 Maven高级 java relati
  • Kubernetes Pod详解

    一 Pod介绍 1 Pod的结构 每个Pod中都可以包含一个或者多个容器 这些容器可以分为两类 用户程序所在的容器 数量可多可少 Pause容器 这是每个Pod都会有的一个根容器 他的作用有两个 1 可以以他为依据 评估整个Pod的健康状态
  • esp8266 12e 光控控制板载LED灯

    注意 本篇这里是使用了2个光敏电阻 D2口检测到光暗时才会执行D5的检测 要两个同时检测到黑暗才能点亮LED灯 检测到天黑时led就会快闪 天亮时慢闪 2 两个光敏代码 int LED LED BUILTIN 定义esp8266内置的led
  • 从云1.0时代到云2.0时代

    本文节选自 大话存储2 一书中第20章 转载请注明出处及作者 冬瓜头 20 8 4 云基础架构的 艺术与哲学意境 另外 我发挥了一下想象力 将云想象成为一部精密机械 并画了一张图 如图20 40所示 希望通过这张图能够让大家更加深刻的认识云
  • kubernetes四层负载均衡 —— service(二)

    目录 四 Kubernetes蓝绿部署 金丝雀发布 1 概述 2 金丝雀发布过程 3 蓝绿发布 五 Service代理 kube proxy组件详解 1 kube proxy组件介绍 2 kube proxy工作模式 四 Kubernete
  • uniapp-select 下拉框

    目前uniapp下拉框中比较友好的 功能比较完善 链接 superwei combox 组合框 DCloud 插件市场下拉搜索选择组合框 基于官方uni combox组件 解决选择后再次选择不展示全部选项的问题 支持模糊搜索和JSON数组格
  • mysql SQL语法

    增删改查 增 insert into table col1 clo2 col3 values str1 str2 str3 str1 str2 str3 删 delete form table where Expression 改 upda
  • kaggle竞赛——数据处理

    kaggle竞赛攻略 数据处理 数据导入 Datatable time import datatable as dt df dt fread data train csv print Train size data shape Train
  • (转)JS实现可编辑的表格

    来自网络 这个不错 就转了收藏 http apps hi baidu com share detail 30648462 html
  • MATLAB如何生成独立的随机数

    随机数流 随机数流是由确定性算法生成的一个伪随机数序列的源 伪随机序列是随机数理论序列的逼近 其分布满足独立同分布 i i d 条件 但实际上 确定性算法无法生成 i i d 序列 算法生成的序列可通过分布和相关性的统计检验 表明它们是很好
  • windows 安装metis_Win10 VS2013 suitesparse-metis-for-windows 1.3.1

    suitesparse metis for windows 1 3 1 安装包内附SuiteSparse 4 5 1 Metis 5 1 0和 lapack 3 4 1 Github上面由整理好的suitesparse包适合在Windows
  • react 拖拽组件 react-sortable-hoc的使用

    react 拖拽组件 react sortable hoc 使用react sortable hoc实现拖拽 如图 提示 下面案例可供参考 1 文件1 代码如下 示例 文件名称 dragcomponents import as React