我已经开始用一个简单的教程来研究 react-hooks,令我惊讶的是,我得到了一个我无法弄清楚的错误:
警告:组件正在将文本类型的不受控制的输入更改为 被控制。输入元素不应从不受控制切换到 受控(反之亦然(。决定是使用受控还是 在组件的生存期内不受控制的输入元素。
出现此错误后,我的组件消失了,但我仍然可以输入将在控制台中正确打印的数据。
我尝试设置输入的初始状态并更改
setInputs(inputs => ({
...inputs, [event.target.name]: event.target.value
}));
自
setInputs({...inputs, [event.target.name]: event.target.value});
但我仍然收到错误。
JSX
import React from 'react';
import './styles/form.scss';
import useSignUpForm from './hooks/customHooks.jsx';
const Form = () => {
const {inputs, handleInputChange, handleSubmit} = useSignUpForm();
return (
<React.Fragment>
<div className="formWrapper">
<h1 className="header">Form</h1>
<form onSubmit={handleSubmit}>
<div className="form-group">
<label htmlFor="nicknameInput">Nickname</label>
<input type="text" id="nicknameInput" name="nickname" onChange={handleInputChange}
value={inputs.nickname} required/>
<label htmlFor="emailInput">Email Address</label>
<input type="text" id="emailInput" name="email" onChange={handleInputChange}
value={inputs.email} required/>
<label htmlFor="lastName">Last Name</label>
<input type="text" id="lastName" name="lastName" onChange={handleInputChange}
value={inputs.lastName} required/>
</div>
<button type="submit" className="btn btn-primary">Submit</button>
</form>
</div>
</React.Fragment>
)
};
export default Form;
钩
import React, {useState} from 'react';
const useSignUpForm = (callback) => {
const [inputs, setInputs] = useState({});
console.log(inputs);
const handleSubmit = (event) => {
if (event) {
event.preventDefault();
}
};
const handleInputChange = (event) => {
event.persist();
setInputs(inputs => ({
...inputs, [event.target.name]: event.target.value
})
);
};
return {
handleSubmit,
handleInputChange,
inputs
};
};
export default useSignUpForm;
知道是什么导致了此错误吗?
您收到错误,因为您的输入以undefined
开始,然后具有值。如果将此const [inputs, setInputs] = useState({});
替换为以下内容:
const [inputs, setInputs] = useState({
nickname: '',
lastname: '',
email: ''
});
它会消失。
我最喜欢的在 react 钩子中处理受控输入的方式就是这种语法。为您尝试处理的每个输入创建单独的状态,然后在 onChange 中调用 setInput
onChange={e => setInput(e.target.value)}
出现错误的原因是初始状态只是一个空对象,如果要这样做,则必须将状态更改为。
const [inputs, setInputs] = useState({
nickname: '',
lastname: '',
email: ''
});