javascript - ReactJs - 调用 setState 后不呈现更新
问题描述
我有以下 React 组件。我对反应比较陌生,所以我没有牢牢掌握使用钩子的所有概念。
我已经看到其他一些问题指向 setState 函数的异步性质,但这似乎不是这里的问题。
对代码的期望:我希望当用户在 fName 和 lName 输入中输入值时,h1 会自动更新和呈现
实际发生的情况:当我在输入中输入值时,键入的值不会显示在 UI 的输入字段中。标题 (h1) 也不会更新。
附加说明:如果我使用“if”语句检查并有条件地更新对象的相应属性,而不是使用 prevState[name] = value;,则代码按预期工作。在 setHeadingText 中。
import React, {useState} from "react";
function App() {
const [headingText, setHeadingText] = useState({
fName: "",
lName: ""
});
function handleChange(e){
const {name, value} = e.target;
setHeadingText(prevState => {
prevState[name] = value;
return prevState;
})
}
return (
<div className="container">
<h1>Hello {headingText.fName + " " + headingText.lName}</h1>
<input type="text" name="fName" placeholder="First Name" value={headingText.fName} onChange={handleChange}/>
<input type="text" name="lName" placeholder="Last Name" value={headingText.lName} onChange={handleChange}/>
<button>
Submit
</button>
</div>
);
}
export default App;
解决方案
您不是在更新对象的身份,而是在内部更新对象。React 看不到这种变化。
将 fName 和 lName 分离为单独的状态原子,或者将整个状态对象更新为一个新对象,而不是在内部对其进行变异:
setHeadingText(prevState => ({...prevState, [name]: value}))
推荐阅读
- javascript - 如何使用按钮更改文本颜色
- php - Composer 在尝试解决依赖关系时崩溃
- linux - 如何在 NCDU 命令中排除特定目录
- delphi - 设置 Form Parent 会导致控件处于非活动状态
- python - 将 HOCR 输出转换为字符串(用于正则表达式)的策略是什么?
- docker - 无法连接到远程 Ubuntu 服务器上运行的 elasticsearch 或 kibana
- javascript - Javascript 画布 - 从加载的 4 波段 RGB 图像中删除 alpha 到 3 波段 JPEG 图像?
- javascript - Google Map-SDK:多边形不会出现在 Android 设备上
- android - 在 Ionic 4 应用程序中进行的 API 调用无法在 Android 设备上运行
- c++ - 构造模板化元组类型