reactjs - 如何使用修改后的值更新当前选择的待办事项?
问题描述
我正在制作一个待办事项应用程序来通过钩子提高我的反应技能,我想制作一个函数 updateTask 来更新当前选定的任务,无论我在触发 getCurrentTask 函数后输入的内容,它都会用当前选择的值填充输入值任务的文本值。
这是 updateTask 函数:
function updateTask(statePlaceholder, id) {
const updatedTaskIndex = statePlaceholder.tasks.findIndex(
task => task.id === id
);
const updatedTask = statePlaceholder.tasks.map(task => {
return { ...task, text: statePlaceholder.currentTask.text };
});
const updatedTasks = [
...statePlaceholder.tasks.slice(0, updatedTaskIndex),
updatedTask,
...statePlaceholder.tasks.slice(updatedTaskIndex + 1)
];
return {
...statePlaceholder,
tasks: updatedTasks,
currentTask: null
};
}
我在表单中的handleSubmit函数中使用了这个函数
function handleSubmit(e) {
e.preventDefault();
state.currentTask
? setState(updateTask(state, state.currentTask.id))
: setState(createTask(state, value));
setValue("");
}
我希望能够更新当前选择的任务。
解决方案
您的函数中有错误updateTask
,但在此之前有一个建议。
看起来您正在使用复合状态,例如
[state, setState] = useState({tasks:[], current:0})
相反,更惯用的方法是使用单独的状态变量:
[tasks, setTasks] = useState([]);
[current, setCurrent] = useState(0);
这也将使您的状态管理更加容易。
现在回到错误updateState
,在检索 之后updatedTaskIndex
,您需要 1)检索originalTask
,2)对其进行变异并 3)将其放回新数组中的正确位置。你没有做#1,因此你尝试的#2 会产生错误的结果。做类似的事情
origTask = tasks[taskIndex];
updatedTask = {...origTask, text: text}
推荐阅读
- node.js - 如何在某些非云环境中打包和部署 Node/Express Web 应用程序?
- javascript - 如何在 phpunit + selenium 测试平台上获取 ajax 请求状态代码和响应数据?
- apache-spark - 我们可以将 Elasticsearch 视为 Spark Streaming 的状态维护数据存储吗?
- acumatica - 在查找屏幕中添加选中的复选框列并启用多选
- python - python:从.txt中读取并判断txt文件中的新字符串
- javascript - 如何将 JQuery 变量传递给 JQuery 中的 $_POST 键
- racket - 使用“eval”和“map”评估 cons 表达式(用 Racket 编写的 Racket 解释器)
- sql-server - 如何在 SSRS 堆积图数据标签中隐藏零值
- selenium-webdriver - 网页中的字段在自动化过程中表现不同。可能吗?
- javascript - webpack 4 - 用于多个条目的拆分块插件