reactjs - 警告:组件正在将受控输入更改为不受控
问题描述
import React, { useState } from 'react'
const App = () => {
const [fullname, updatfullNa] = useState({
fName:'',
lName:'',
eMail:'',
pHone:''
})
const Inputevent = (event) => {
// const value = event.target.value
// const name = event.target.name
const{value, name}=event.target
updatfullNa((preValue) => {
if (name === 'fName') {
return {
fName: value,
lName: preValue.lName,
eMail:preValue.eMail,
pHone:preValue.pHone
}
}
else if (name === 'lName') {
return {
fName: preValue.fName,
lName: value,
eMail:preValue.eMail,
pHone :preValue.pHone
}
} else if (name === 'eMail') {
return {
fName: preValue.fName,
lName: preValue.lName,
eMail:value
}
}
else if (name === 'pHone') {
return {
fName: preValue.fName,
lName: preValue.lName,
eMail:preValue.eMail,
pHone:value
}
}
})
}
const onSubmit = (event) => {
event.preventDefault()
}
return (<>
<form onSubmit={onSubmit} >
<div className="form">
<h1>Hello {fullname.fName} {fullname.lName} <br/>
<span className="EP"> {fullname.eMail} <br/>{fullname.pHone} </span> </h1>
<input type="text" placeholder="Enter Your Name"
name="fName"
onChange={Inputevent} value={fullname.fName}/>
<input type="text" placeholder="Enter Your Last Name" name="lName" onChange={Inputevent} value={fullname.lName}/>
<input type="email" placeholder="Enter Your Email" name="eMail" onChange={Inputevent} value={fullname.eMail}/>
<input type="number" placeholder="Enter Your Phone Number" name="pHone" onChange={Inputevent} value={fullname.pHone}/>
<button type="submit" >Submit me </button>
</div>
</form>
</>
)
}
export default App
警告:组件正在将受控输入更改为不受控。这可能是由于值从定义变为未定义引起的,这不应该发生。决定在组件的生命周期内使用受控输入元素还是不受控输入元素。更多信息:https ://reactjs.org/link/controlled-components 输入 div 表单 App@http://localhost:3000/static/js/main.chunk.js:52:89
解决方案
问题就在这里,当name === 'eMail'
您返回以下状态时,该状态没有pHone
.
return {
fName: preValue.fName,
lName: preValue.lName,
eMail:value
}
还可以考虑重构您的代码,如下所示
const Inputevent = (event) => {
// const value = event.target.value
// const name = event.target.name
const{value, name}=event.target
updatfullNa((prevState) => ({...prevState, [name]: value }))
}
prevState...
之前表示将所有 prevState 复制到一个新 Object 并仅更新键 [name] 的值
参考
推荐阅读
- javascript - 使用 .NET 在 Autodesk Forge 上下载文件
- javascript - Angular Material 2 工具提示问题
- spring - 在 Spring MVC 中使用 Hibernate 进行 MySQL 列加密
- flutter - FutureBuilder:即使在推送导航器之后也调用未来函数
- java - 如何将 spring 存储库条目的 id 设置为精确值?
- sql - 使用聚合函数时 CTE 行为异常
- ipad - 离子图标未显示在 ipad / edge 上
- react-native - React Native:尝试从 https://cataas.com api 获取图像时出现错误
- r - 在 Rstudio 中将 rmarkdown 文件编译为 PDF 文档时,R 中的 kableExtra 函数返回乳胶错误
- cassandra - 系统使用 Pax-runner 可以正常工作,但不能使用 Karaf。数据税例外。游泳池很忙