【发布时间】:2022-06-16 08:05:49
【问题描述】:
我正在尝试创建一个具有拖放项目功能的待办事项应用程序。我正在使用 React DND 并且到目前为止一切正常,但是当一个新项目添加到列表中时,我意识到在 useDrop 中的“drop”方法中调用的 函数只会使用页面首次加载时的状态。
没有其他组件有这个问题,当我尝试简单的 onClick 来检查同一组件的状态时,也会记录正确的状态。其他组件(例如插入新任务的组件)根本没有问题,这只发生在使用 React DND 的组件上。我还检查了 chrome 中的 react 开发工具,并且可以确认状态也在更新。
在“drop”中调用的函数是从两个组件向上传递的,我尝试使用的状态也在该组件中。
任何帮助将不胜感激。谢谢。
export const ToDo = ({
status,
todoText,
todoID,
deleteTodo,
updateTodoStatus,
resortList,
}: TodoProps) => {
const [, drag] = useDrag(() => ({
type: 'TODO_DRAG',
item: { todoID, todoText },
}));
const [, drop] = useDrop(() => ({
accept: 'TODO_DRAG',
drop: (droppedTodo: dropAndDropItem) => {
console.log('dropping');
if (todoID === droppedTodo.todoID) return;
resortList(todoID, droppedTodo.todoID);
},
}));
return (
<li ref={drop} onClick={() => resortList(1, 2)}>
<div ref={drag}>
<label htmlFor="Change Todo Status">
<input
type="checkbox"
checked={status}
onChange={() => updateTodoStatus(todoID)}
/>
</label>
<p>{todoText}</p>
<button onClick={() => deleteTodo(todoID)}>X</button>
</div>
</li>
);
};
【问题讨论】: