reactjs - startDate 上的 useState 不更新我使用 setStartDate 时的日期
问题描述
这是我的代码
import format from "date-fns/format";
import setHours from "date-fns/setHours";
import setMinutes from "date-fns/setMinutes";
const [startDate, setStartDate] = useState<Date>(new Date());
const startTime = setHours(setMinutes(date, 0), hour);
console.log(startTime); // showing correct date and time as I set
setStartDate(startTime);
console.log(startDate); // this is showing current date and time
但是当我这样做时
console.log(startDate);
我得到当前的日期和时间。但是,如果我这样做
console.log(startTime);
它显示了我想要的正确日期和时间。
你能帮忙吗?我正在使用 React 的 tsx 格式。开发人员还有几个小时没有空,我必须快速将其交付给我的客户。
解决方案
useState
是一个异步函数。当您尝试读取状态时,它正在执行中,其值尚未更新。考虑以下示例:
//Defining the state
const [startDate, setStartDate] = useState<Date>(new Date());
const startTime = setHours(setMinutes(date, 0), hour); //Calculating new state
console.log(startTime); // Works fine due to synchronouse behaviour
setStartDate(startTime); //Async, will wait if any other state updates are in pipeline. If not, it'll try to update asynchronously
console.log(startDate); // By the time you reach here it's still updating and pointing to the old value.
如果要读取新值,可以考虑使用useEffect(fn,[])
. 在您的情况下,您可以读取一个新状态,如下所示:
const [startDate, setStartDate] = useState<Date>(new Date());
useEffect(()=>{
console.log(startDate); // Fires whenever startDate changes
},[startDate])
推荐阅读
- symfony - Symfony 表单构建器:如何在树枝中迭代/呈现动态数量的文本字段?(Sylius - 额外结帐步骤)
- ios - 将日期字符串转换为日期对象
- javascript - Firebase 身份验证链接白名单异常 (sendSignInLinkToEmail)
- go - 如何将 Go 客户端应用程序连接到 IBM VS Code Fabric Extension?
- database - 我是否必须将工作归结为火花,或者我可以从客户端库运行它们?
- jquery - jquery 日期时间选择器控件弹出窗口
- ios - VoIP通话结束并且应用程序处于终止状态后是否可以打开ios应用程序视图?
- angular - 升级到 Angular 9 后指令不适用于 FormControl
- python - 在python中迭代pandas DataFrame的连接
- random - 从自定义分布生成随机值