javascript - 使用功能组件创建 React 表单时出错
问题描述
今天我只是想用功能组件和使用 React 的 useState 钩子创建一个用于登录/注册的表单。但是,我遇到了这个问题。如果有人可以提供帮助,将不胜感激。我试图寻找一个原因,然而,它无济于事。谢谢。
- 一旦我在电子邮件字段中提供输入,我就会收到警告。''警告:组件正在将未定义类型的受控输入更改为不受控。输入元素不应从受控切换到不受控(反之亦然)。'' 我不知道我的代码哪里出了问题。
function Login(){
const [state, setState] = useState({
email:'',
password:'',
})
const handleChange = e => {
setState({ [e.target.name]: e.target.value })
}
const handleSubmit = e => {
e.preventDefault();
var email = state.email;
var password = state.password;
// Firebase requires passwords to be of length 6 or above
if (password.length < 6) {
alert("Password must of length 6 or more.");
} else {
fire.auth().createUserWithEmailAndPassword(email, password);
alert("Signed Up Successfully!");
}
}
return(
<>
<Navbar/>
<div>
<form>
<input name="email" value={state.email} onChange={handleChange} placeholder="email"></input>
<input name="password" value={state.password} onChange={handleChange} placeholder="password"></input>
<button type="submit" onClick={handleSubmit}>Sign Up!</button>
<button type="submit">Login!</button>
</form>
</div>
</>
);
}
解决方案
在useState
钩子中,旧状态和传递给setState
函数的对象不会像setState
类组件那样自动合并。在这里,您需要确保在调用时存在所有setState
状态属性以及状态的更新属性。
否则,您传递给 的setState
对象将替换当前状态的对象。
您的状态有两个属性:
{
email:'',
password:'',
}
但是,当您在 中更新状态时,handleChange
您会省略一个状态属性。与缺少的属性关联的输入从受控组件变为不受控组件,因此您会收到错误:
const handleChange = e => {
setState({ [e.target.name]: e.target.value })
}
您需要将旧状态与更新的属性合并:
const handleChange = e => {
setState({ ...state, [e.target.name]: e.target.value })
}
或者将状态拆分为两个useState
调用,每个属性调用一个:
const [email, setEmail] = useState('');
const [password, setPassword] = useState('');
然后让处理程序为每个更新:
const handleEmailChange = e => {
setEmail({ [e.target.name]: e.target.value })
}
const handlePasswordChange = e => {
setPassword({ [e.target.name]: e.target.value })
}
推荐阅读
- javascript - 输入的值即使不满足要求也会发送
- php - 单击提交按钮时,成功提交按摩显示,但某些字段为空。还显示未定义索引和未定义变量错误
- hadoop - 我们如何知道HDFS的阈值,如果使用cloudera我们每次都必须手动检查吗?
- javascript - 在地图功能中定位点击的卡片索引
- keras - TypeError:('关键字参数不理解:','data_format')
- java - Rabbitmq 只允许一个并发消费者
- java - 不使用基于 java 的 tasklet 执行存储过程
- html - 如何在 ionic 3 中使用 @output
- observable - 使用可观察的。有人可以向我解释这段代码是如何工作的
- angular - 无法在 Angular js 中配置服务工作者