如何在一个函数中使用两个 useState 以便第二个 useState 可以使用第一个更新的 useState?
how to use two useState in one function so that the second useState can use the first updated useState?
反应:
我正在尝试创建 todoapp,但负责添加新任务的组件出现问题。我想为新任务分配一个添加日期。这是我的组件(tasksList
是所有任务的列表):
import { useState } from "react";
const ListHandler = ({ tasksList, setTasksList }) => {
const [newTask, setNewTask] = useState({
id: tasksList.length,
content: "",
done: false,
active: true,
date: null,
});
const inputHandler = (e) => {
setNewTask((prevState) => ({
...prevState,
content: e.target.value,
}));
};
const addHandler = (e) => {
e.preventDefault();
setNewTask((prevState) => ({
...prevState,
date: new Date().toTimeString().split(" ")[0],
}));
setTasksList((prevState) => [...prevState, newTask]);
};
return (
<section className="listHandler">
<form className="form">
<input
className="form__input"
onChange={(e) => inputHandler(e)}
></input>
<button className="form__button" onClick={(e) => addHandler(e)}>
Add Task
</button>
</form>
</section>
);
};
export default ListHandler;
当我单击按钮时,我在 tasksList
中获得了一个日期为 null
的新任务,因为在更新 newTask
之前调用了 setTasksList
,对吗?我的问题是如何解决这个问题?
发生这种情况是因为 newTask 将在下一次渲染中可用,例如您可以这样做:
const addHandler = (e) => {
e.preventDefault();
const newDate = date: new Date().toTimeString().split(" ")[0];
setNewTask((prevState) => ({
...prevState,
date: newDate
}));
setTasksList((prevState) => [...prevState, {...newTask, date: newDate }]);
};
这可能会解决您的问题创建了一个新状态 TaskName 用于处理更改输入并修复了 addhandler 函数和 inputhandler .
const [newTask, setNewTask] = useState([]);
const [taskName, setTaskName] = useState("");
const inputHandler = (e) => {
setTaskName(e.target.value);
};
const addHandler = (e) => {
e.preventDefault();
setNewTask([...newTask,{
id: newTask.length+1,
content: taskName,
done: false,
active: true,
date: new Date().toTimeString().split(" ")[0],
}]);
setTaskName("");
};
反应:
我正在尝试创建 todoapp,但负责添加新任务的组件出现问题。我想为新任务分配一个添加日期。这是我的组件(tasksList
是所有任务的列表):
import { useState } from "react";
const ListHandler = ({ tasksList, setTasksList }) => {
const [newTask, setNewTask] = useState({
id: tasksList.length,
content: "",
done: false,
active: true,
date: null,
});
const inputHandler = (e) => {
setNewTask((prevState) => ({
...prevState,
content: e.target.value,
}));
};
const addHandler = (e) => {
e.preventDefault();
setNewTask((prevState) => ({
...prevState,
date: new Date().toTimeString().split(" ")[0],
}));
setTasksList((prevState) => [...prevState, newTask]);
};
return (
<section className="listHandler">
<form className="form">
<input
className="form__input"
onChange={(e) => inputHandler(e)}
></input>
<button className="form__button" onClick={(e) => addHandler(e)}>
Add Task
</button>
</form>
</section>
);
};
export default ListHandler;
当我单击按钮时,我在 tasksList
中获得了一个日期为 null
的新任务,因为在更新 newTask
之前调用了 setTasksList
,对吗?我的问题是如何解决这个问题?
发生这种情况是因为 newTask 将在下一次渲染中可用,例如您可以这样做:
const addHandler = (e) => {
e.preventDefault();
const newDate = date: new Date().toTimeString().split(" ")[0];
setNewTask((prevState) => ({
...prevState,
date: newDate
}));
setTasksList((prevState) => [...prevState, {...newTask, date: newDate }]);
};
这可能会解决您的问题创建了一个新状态 TaskName 用于处理更改输入并修复了 addhandler 函数和 inputhandler .
const [newTask, setNewTask] = useState([]);
const [taskName, setTaskName] = useState("");
const inputHandler = (e) => {
setTaskName(e.target.value);
};
const addHandler = (e) => {
e.preventDefault();
setNewTask([...newTask,{
id: newTask.length+1,
content: taskName,
done: false,
active: true,
date: new Date().toTimeString().split(" ")[0],
}]);
setTaskName("");
};