reactjs - setState 在反应钩子中没有按预期工作
问题描述
当我使用 setState 钩子更新时,值没有得到更新。据我所知,这个 setState 调用是异步的。如何解决这个问题?
export default function ResultItem({result:{ name, result_type, entry, unit, min_val, max_val, in_spec}, handleEntryChange}){
const [inSpec, setInSpec] = useState(in_spec)
const [result, setResult] = useState(entry);
console.log(handleEntryChange)
return(
<Fragment>
<td>{name}</td>
<td>{result_type}</td>
<td>{}</td>
<td>
<input
name={name}
type={result_type === 'numeric' ? "number" : "text"}
value={result || ''}
onChange={(e) => {
let val = parseInt(e.target.value)
setResult(val)
if(val >= min_val && val <= max_val){
setInSpec(true);
}else{
setInSpec(false);
}
console.log(result, inSpec, val)
handleEntryChange({[name]: val, [name]: inSpec});
}}
/>
</td>
<td>{unit}</td>
<td>{inSpec? 'YES': 'NO'}{console.log(in_spec)}</td>
</Fragment>
)
}
解决方案
您基本上是在尝试进行自定义输入。一般来说,您需要注意如何控制此输入?在您的界面上,您拥有entry
(可能是初始值),但在内部您拥有result
.
两者实际上都是value
输入上下文,但它们通常要么从外部(在接口上)控制,要么在内部跟踪,但不是两者兼而有之。
只是成像如果entry
改变了,可能是result
什么?
正确的方法如下
const Input = ({ value, onChange }) => {
// no internal state here
return (
<input value={value} onChange={onChange} />
)
}
这是一个纯粹的通过模型,两者value
都由onChange
外部驱动。
现在您可能会问如何更改自定义输入的外观。
您现在可以编写包装器onChange
来注入您自己的实现。
const onValueChange = e => {
// e.target.value
// do your own handling and then
// if need call onChange(e) to handle external
}
<input onChange={onValueChange} />
我将跳过input
此处的 UI 更改,因为您的示例已经存在。
这里的最后一条评论,受控输入没有存储。因此,为了使用您的输入,您需要从外部定义一个状态。
const [result, setResult] = useState(0)
return (
<YourInput value={result} />
)
这里的主要信息是谁应该管理存储(内存),这可能是在设计任何组件之前要放置的第一固定装置。
推荐阅读
- python - 基于字典在循环中定义变量
- node.js - SageMakerRuntime invokeEndpoint:解析这个 JSON 给我 undefined
- vb.net - 获取以String形式存储的命令的第一个参数
- kubernetes - helm prometheus-operator 未从 api 获取自定义指标
- winapi - 检查 EXE 以确定它是用户可执行文件还是系统服务
- pandas - 日期时间索引数据帧日志时间刻度(x 轴)绘图
- android - 安卓。WindowBackground 中心图标不像活动图标那样居中
- c# - 如何从后面的代码中设置 html 输入日期标签的值
- python - python和pyqt5 - 单击按钮后传递变量
- javascript - 无法让 alignItems 在 React 中工作