javascript - 为什么我的拖放项目会卡住?

标签 javascript reactjs react-hooks

我正在学习 React Hooks,边做边学,效果最好。

我认为我做了一些有趣的事情,并找到了一个关于如何使用 React 实现拖放的在线教程。 这是通过类组件完成的,因此我通过更改它并使用钩子(Hook)来挑战自己。

我追求的是:

enter image description here

左侧就像一张 table 和椅子。每个绿色区域都是一把椅子,我们可以将元素扔到上面。

右侧:就像一袋元素,可以放置在自己的“椅子”上。就像用户将其放在椅子上之前的临时位置

问题:

enter image description here

我可以毫无问题地将项目从左侧拖动到右侧,但是当从右侧拖动到左侧时,该项目会掉落在左侧,但也会保留在右侧。

我认为我必须在任何地方使用相同的数据集,以便所有子组件都从父组件继承数据,并且当通过 setDragables 在一个组件中更新数据时,我认为所有内容都会更新,但它事实并非如此...

它有很多代码,所以我创建了这个 sandbox .

感谢您的任何想法!

最佳答案

我很难浏览你的代码,因为那里有很多代码。

看来主要问题是,当您从左到右移动时,它不会重新渲染,但从右到左移动时,它会正确地重新渲染。 当您进行多次拖放操作时,右侧列表将更新为具有上一次拖放应具有的正确值。 因此,进一步研究为什么它不重新渲染将是有益的。

我确实想出了一个解决方案来修复您的代码沙箱代码,尽管这绝对不是最优雅的方法,并且还有许多其他方法可以解决此问题。 我决定解决此问题的方法是在使用 useEffect Hook 更新 Dragables 时更新状态。然后我为未分配的人创建了状态。

代码沙箱链接在这里https://codesandbox.io/s/react-hooks-usestate-35chk?fontsize=14&hidenavigation=1&theme=dark

我所做的唯一更改是对 MyFuncApp 函数,并且我认为我将“Go To Gym”项目的 DropslotNumber 更改为 0,而不是像您最初那样将其插入未分配的数组中。

  const initial = Dragables.filter(i => {
    return i.DropSlotId === 0;
  });
  const [unassigned, setUnassigned] = useState(initial);
  const onDragEnd = (event, newPos, data) => {
    setUnassigned(curr => curr.filter(item => item.CId !== data));
    //post
  };
  useEffect(() => {
    setUnassigned(
      Dragables.filter(i => {
        return i.DropSlotId === 0;
      })
    );
  }, [Dragables]);

上面的代码片段是主要的更改。通过过滤放置槽 0 中的所有项目来创建初始状态。位于右侧。 useEffect 用于通过查看 Dragables 数据何时更改然后正确更新列表来更新未分配列表。另一部分是 onDragDrop,它确保 id 从未分配列表中删除。它当前正在使用您在项目上拥有的 CId,尽管您可能想要更改它。

为了使用 CId,我将未分配项目的 onDragEnd 函数调用修改为如下

  onDragEnd={event => {
                onDragEnd(event, p.refArea, p.CId);
              }}

希望我的代码有一点帮助

祝你好运!

关于javascript - 为什么我的拖放项目会卡住?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59040782/

相关文章:

javascript - 获取 `url` 的访问被 CORS 策略 : No 'Access-Control-Allow-Origin' header is present on the requested resource. ReactJS 阻止

reactjs - 立即更新 useState

javascript - 如何在同一时间内创建更多超时或间隔

javascript - 如何在网络音频中循环播放一定次数的wav?

javascript - 在使用 IOS 7 的 iPad 中,在哪里查看 Safari 浏览器错误控制台?

reactjs - react - 警告 : Use the `defaultValue` or `value` props on <select> instead of setting `selected` on <option>

javascript - 通过 Redux 获取数据时加载屏幕

javascript - 尝试使用钩子(Hook)添加 'liking' 功能,但所有照片同时被点赞

reactjs - 如何在 React with Typescript 中使用和指定 Generic Hooks?

javascript - 使用ajax加载文本文件内容