javascript - react hooks 为什么我的拖放项目卡住了?
问题描述
我正在学习反应钩子并通过实践来学习最好。
我想我做一些有趣的事情,并找到了一个关于如何使用 react 实现拖放的在线教程。这是使用类组件完成的,所以我通过更改它并使用钩子来挑战自己。
我追求的是:
左侧就像一张带椅子的桌子。每个绿色区域都是一把椅子,我们可以将物品放到上面。
右侧:就像一袋物品,可以放在自己的“椅子”上。就像用户将其放在椅子上之前的临时位置
问题:
我可以毫无问题地从左到右拖动一个项目,但是当从右侧拖动到左时,该项目会落在左侧,但也保留在右侧。
我想我必须在任何地方都使用相同的数据集,所以所有子组件都从父组件继承数据,当数据在一个组件中更新时,setDragables
我认为一切都会更新,但事实并非如此......
它有很多代码,所以我创建了这个沙箱。
感谢您的任何想法!
解决方案
我很难浏览你的代码,因为那里有很多。
似乎主要问题是从左到右时它不是重新渲染,而是在从右到左时正确地重新渲染。当您进行多次拖放操作时,右侧列表将更新为具有前一次拖放应具有的正确值。因此,进一步研究为什么它不重新渲染会是有益的。
我确实想出了一个解决方案来修复您的代码沙箱代码,尽管这绝对不是最优雅的方式,而且还有很多其他方式可以解决这个问题。我决定解决此问题的方法是使用 useEffect 挂钩更新 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 数据何时更改然后正确更新列表来更新未分配列表。另一部分是确保从未分配列表中删除 id 的 onDragDrop。它当前正在使用您在项目上拥有的 CId,尽管您可能想要更改它。
要使用 CId,我将 onDragEnd 的函数调用修改为未分配的项目如下
onDragEnd={event => {
onDragEnd(event, p.refArea, p.CId);
}}
希望我的代码有点帮助
祝你好运!
推荐阅读
- javascript - Vue过滤器仅适用于第一个分页页面
- python - 使用 Pandas 根据另一列的值从相邻列中获取立即值
- automake - 如何从 automake/libtool 库中获取符号列表?
- python - AES - 如何将字节字符串转换为字节字节字符串?
- asp.net-core - 带有 FromBody 的路由不适用于 ASP.NET Core
- arrays - 尝试从 SwiftUI 视图中的嵌套数组调用
- javascript - 为我的原型使用“Swiper”JS 库时的 CSS 挑战
- scala - 在 Scala 中,是否可以通过迭代 ListMap 将部分函数的集合构建成一个函数?
- firefox - Chart.js 的跨浏览器支持
- jquery - Django:模型和视图以及 jQuery DataTables,hello world 示例