React DnD 拖动项目未使用 useState 更新
React DnD drag item is not updating with useState
我将 react-dnd 与 react maui 树一起使用。我的目标是一次拖动多个项目。
我的方法是将树中的所有 selected 节点存储在 useState 中作为一个 ids(字符串)数组。单击节点时,状态会更新,我可以成功 select 多个节点。
问题始于拖动。该项目未更新。
// returns the state
// initially e.g. ["4372"] later it should return the correct result
const getState = () => {
return selectedTreeNodes
}
const [, drag] = useDrag(() => ({
type: "el",
item: getState(),
end: (item, monitor) => {
const dropResult = monitor.getDropResult<DropResult>();
if (item && dropResult) {
alert(`You dropped ${item} ${selectedTreeNodes} into ${dropResult}!`);
}
console.log("DROPPED", item, "SELECTEDFIELDS", getState()); // all these are only logging the old state
},
collect: (monitor) => ({
isDragging: monitor.isDragging(),
handlerId: monitor.getHandlerId(),
}),
}));
我尝试了不同的方法。 selectedTreeNodes 是 ID。它们是从父组件传递下来的,它们就是状态。当我单击父节点时,树打开,item 从第一个 selected 父节点获取 id。
更改 selection 并开始拖动后,item 不再更新,因此我没有得到更新的 ID,只有第一。状态本身正确更新。
有什么建议吗?
尝试将 useMemo 改为 useState 并在 useMemo 中使用依赖项
useMemo(() => {
// code
}, [dependency])
并且在更改依赖项时你将触发整个备忘录
同样是 useCallback 但 useCallback return 函数和 useMemo return 变量
如评论中所述,将 useState 中的 selectedTreeNodes 添加到 useDrag[ 的 dependency 数组 中=18=] 会变魔术的。
下面的代码(比问题中的短一点)可能有同样问题的人:
const [, drag] = useDrag(
() => ({
type: "el",
item: selectedTreeNodes,
collect: (monitor) => ({
isDragging: monitor.isDragging(),
handlerId: monitor.getHandlerId(),
}),
}),
[selectedTreeNodes] // DEPENDENCY ARRAY HERE
);
我将 react-dnd 与 react maui 树一起使用。我的目标是一次拖动多个项目。
我的方法是将树中的所有 selected 节点存储在 useState 中作为一个 ids(字符串)数组。单击节点时,状态会更新,我可以成功 select 多个节点。
问题始于拖动。该项目未更新。
// returns the state
// initially e.g. ["4372"] later it should return the correct result
const getState = () => {
return selectedTreeNodes
}
const [, drag] = useDrag(() => ({
type: "el",
item: getState(),
end: (item, monitor) => {
const dropResult = monitor.getDropResult<DropResult>();
if (item && dropResult) {
alert(`You dropped ${item} ${selectedTreeNodes} into ${dropResult}!`);
}
console.log("DROPPED", item, "SELECTEDFIELDS", getState()); // all these are only logging the old state
},
collect: (monitor) => ({
isDragging: monitor.isDragging(),
handlerId: monitor.getHandlerId(),
}),
}));
我尝试了不同的方法。 selectedTreeNodes 是 ID。它们是从父组件传递下来的,它们就是状态。当我单击父节点时,树打开,item 从第一个 selected 父节点获取 id。
更改 selection 并开始拖动后,item 不再更新,因此我没有得到更新的 ID,只有第一。状态本身正确更新。
有什么建议吗?
尝试将 useMemo 改为 useState 并在 useMemo 中使用依赖项
useMemo(() => {
// code
}, [dependency])
并且在更改依赖项时你将触发整个备忘录 同样是 useCallback 但 useCallback return 函数和 useMemo return 变量
如评论中所述,将 useState 中的 selectedTreeNodes 添加到 useDrag[ 的 dependency 数组 中=18=] 会变魔术的。
下面的代码(比问题中的短一点)可能有同样问题的人:
const [, drag] = useDrag(
() => ({
type: "el",
item: selectedTreeNodes,
collect: (monitor) => ({
isDragging: monitor.isDragging(),
handlerId: monitor.getHandlerId(),
}),
}),
[selectedTreeNodes] // DEPENDENCY ARRAY HERE
);