RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1576586
Accepted
MIA
MIA
Asked:2024-04-17 19:19:12 +0000 UTC2024-04-17 19:19:12 +0000 UTC 2024-04-17 19:19:12 +0000 UTC

可反应拖动一次移动多个元素

  • 772

我的项目使用react-draggable库,表格形式的数据(相同的可拖动元素)在屏幕上移动,并且可以记录它们的移动。是否可以使用此库选择多个元素并一次在屏幕上移动选定的元素?这就是代码的一部分:

           <Draggable
                onDrag={onDrag}
                onStop={onChangePositionHandler}
                nodeRef={nodeRef}
                position={{ x: table.position.x, y: table.position.y }}
                zIndex="8"
            >
                <div
                    className={styles.MainContainer}
                    id={table.name}
                >
                {table.name}
               </div>
            </Draggable>

这是一个在移动对象时触发的函数,允许您保存新的坐标。

const onChangePositionHandler = (event, dragElement) => {
        onStop();
        const changedTable = {
            id: table.id,
            name: table.name,
            isCreatedByUser: table.isCreatedByUser,
            isAssociator: table.isAssociator,
            color: tableColor,
            position: {
                x: dragElement.x,
                y: dragElement.y
            },
            columns: table.columns
        };

        onChangeTableHandler(changedTable, areaName);
    };

有一个想法是收集一组 Draggable 对象,然后移动整个数组。我只是不知道如何计算每个坐标的新坐标并分配它们。有人遇到过类似的问题吗?该项目还有react-zoom-pan-pinch 库,但它的包装器用于移动图中的所有表。你只需要移动你最喜欢的。如何附加这样的功能?

javascript
  • 1 1 个回答
  • 29 Views

1 个回答

  • Voted
  1. Best Answer
    Arbery
    2024-04-17T23:52:34Z2024-04-17T23:52:34Z

    您可以选择多个元素并一次在屏幕上移动选定的元素。组件创建的每个元素Draggable都有一个位置,并且主动拖动的元素有一个移动范围 -deltaX因此deltaY,解决方案由 2 点组成:

    1. 通过更改状态来选择必要的元素
    2. 拖动时,获取增量并将它们传递到上方的某个位置,然后将所有活动增量的位置更改为这些增量

    简化形式如下所示:

    App.js - родитель

    import React, { useState } from 'react';
    import DragElement from './DragElement'
    
    function App() {
      const [delta, setDelta] = useState({x: 0, y: 0})
    
      return (
        <div className='App'>
          <DragElement
            text='Блок 1'
            changeDelta={setDelta}
            delta={delta}
          />
          <DragElement
            text='Блок 2'
            changeDelta={setDelta}
            delta={delta}
          />
        </div>
      );
    }
    export default App;
    

    子组件DragElement:

    import React, { useState, useEffect } from 'react';
    import Draggable from 'react-draggable';
    
    const DragElement = ({text, changeDelta, delta}) => {
      const [position, setPosition] = useState({x: 0, y: 0});
      const [active, setActive] = useState(false);
    
      const onDrag = (e, dragElement) => {
        changeDelta({x: dragElement.deltaX, y: dragElement.deltaY})
      };
    
      useEffect(() => {
        if (!active) return;
        setPosition( prev => ({ x: prev.x + (delta?.x || 0), y: prev.y + (delta?.y || 0)}) );
      }, [delta])
    
      return (
        <div>
          <Draggable
            position={position}
            onDrag={onDrag}
          >
            <div>
              <div>
                <button
                  className={`button${active ? ' button--active' : ''}`}
                  onClick={() => setActive(prev => !prev)}
                >
                  {text}
                </button>
              </div>
            </div>
          </Draggable>
        </div>
      );
    };
    
    export default DragElement;
    

    但解决方案并不理想,建议尝试优化,以免重新渲染所有子组件,以及通过单击添加/删除 - 拖动时删除 Activity。

    编辑部分拖动

    • 1

相关问题

  • 第二个 Instagram 按钮的 CSS 属性

  • 由于模糊,内容不可见

  • 弹出队列。消息显示不正确

  • 是否可以在 for 循环中插入提示?

  • 如何将 JSON 请求中的信息输出到数据表 Vuetify vue.js?

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5