我希望通过过滤删除App.js数组中的任务。但是在Task子组件中单击delete按钮后,数组保持不变。即使我传递的是id作为函数属性。
// App.js component
function App() {
const [tasks, setTasks] = useState(Tasks);
const deleteTask = (id) => {
Tasks.filter((task) => task.id === id);
};
return (
<TaskComponent
Tasks={tasks}
changeTask={changeTask}
deleteTask={deleteTask}
/>
)
// TaskComponent
type Tasks = {
id: string;
title: string;
author_name: string;
description: string;
status: number | any;
priority: number | any;
};
type Props = {
Tasks: Tasks[];
changeTask: (tasks: Tasks) => {};
deleteTask: (tasks: Tasks) => {};
};
const TaskComponent: FC<Props> = ({ Tasks, changeTask, deleteTask }) => {
const history = useHistory();
const { id } = useParams<IdParams>();
const task = Tasks.find((task) => String(task.id) === id);
const [status, setStatus] = useState(task?.status);
const [priority, setPriority] = useState(task?.priority);
const handleDeleteTask = () => {
deleteTask({
...task,
id
});
history.push("/taskslist");
};
return (
<form>
<input type="button" value="delete" onClick={handleDeleteTask} />
</form>
)
4条答案
按热度按时间93ze6v8z1#
什么是deleteTask?是否需要使用TaskComponent的新
Tasks
值更新TaskComponent上方的状态,即不包括该任务的任务的选择。所以你的问题在于:
筛选器是否删除任务?否-好的,所以也许你需要map / reduce / filter来创建一个新的引用对象,而不需要删除和更新父对象中的状态的任务。使用
setTasks
kpbwa7wx2#
看起来你需要使用setter方法
setTasks
来在你的应用上设置tasks prop,如下所示:luaexgnf3#
问题:-直接过滤问题页面没有重新渲染的任务列表。
解决方案:-
jtoj6r0c4#
1.您实际上应该只将一个任务的数据传递给
Task
组件。您可以通过使用map
来迭代任务数组,并为每个任务返回一个Task
组件,其中只包含所需的props。如果您使用history
只显示一个任务,那么使用history
的id获取任务的过程应该在App
组件中使用filter
完成,而不是在Task
组件本身完成。1.因为
deleteTask
只接受一个id,所以你只需要传递给它一个id。此时你正在传递一个对象。1.在
deleteTask
中,你应该过滤掉所有id * 不 * 匹配作为参数传入的id的任务。1.您需要使用
filter
返回的数组设置一个新的状态。1.注意你的大写- JS是大小写敏感的。例如,在
deleteTask
中,您尝试在Tasks
上过滤filter
,而您应该在tasks
上过滤。1.如果你的任务数据集没有id,我建议你添加它们。这样,您既可以将它们用作迭代的
Task
组件上的键,也可以通过将该id分配给delete按钮来标识应该删除哪个任务。我写了两个简短的例子来说明这些要点。第一个演示如何对数据执行
map
,以使用Task
组件生成一系列任务,第二个演示如何使用history
只显示一个任务。示例一
示例二
这通过在
App
props中传递一个history对象来模拟useHistory
,这样您就可以看到如何只获取通过id传递的任务。它使用额外的useEffect
来显示删除任务后的任务状态。