reactjs - 用于设置值的条件运算符不同步工作?
问题描述
早晨。
使用条件运算符设置新值时,我有一个看起来很傻的问题。下面是一个非常简化的代码块,用于将“selectedDc”的值从 0 切换到 1,反之亦然,然后从服务器获取具有更改后的值的新值。但是,当代码到达 API 调用行时,'selectedDc' 的新值不会立即出现,因此调用是使用旧值进行的。这会导致程序在用户意图之后运行“一键式”。
import React, {useState} from 'react';
const App = () => {
const [selectedDc, setDc] = useState(0)
//event triggered by pressing button
const handleDcChange = async (event) => {
event.preventDefault()
console.log(selectedDc) //prints 0 as expected
const dcValue = (selectedDc === 0) ? 1 : 0
console.log(dcValue) //prints 1 as expected
setDc(dcValue)
console.log(selectedDc) //still after setting new value, prints 0??
//Following lines are just several api calls that work as intended, no need to show implementation.
await daycareService.changeDc(selectedDc)
setShifts(await shiftService.getAll())
setDcTeams(await daycareService.getGroups(selectedDc))
}
}
我首先尝试在不创建新 const 的情况下设置新值,但它的工作方式完全相同,只是落后了一步。
selectedDc === 0 ?
setDc(1) :
setDc(0)
我做错了什么,我应该怎么做才能用第一个触发器获得正确的输出?
解决方案
selectedDoc
将包含在最后一次调用 useState 时(渲染期间)检索到的状态值,之后不会更改。
该useState
实现没有任何方法可以访问该selectedDoc
变量,因为它超出了其范围,因此无法更改其值。
除了上述之外,您可能还需要记住setState 是异步的。
推荐阅读
- python - 在自定义层中禁用了 Tensorflow 2 急切执行
- elasticsearch - 在 Elasticsearch 中搜索和匹配多个字段?
- c# - 启动画面不会移动到下一页
- c++ - 在父类中定义子类的子结构
- django - 我如何解决 UNIQUE 约束失败:Django 中的 auth_user.username 问题
- java - Hibernate Search:并发超时异常
- javascript - 如何通过 vue-slider-component 设置节点名称
- windows - 从命令行运行已签名的 powershell 脚本而无需确认我是否要运行它?
- angular - ng Ant Design:表格顶部的服务器分页不起作用
- windows - 将用户/元数据/运行时数据从 cloudformation 解析到 EC2