【发布时间】:2023-03-05 19:03:02
【问题描述】:
我有以下组件,我在输入中将用户的现有详细信息显示为值,用户应该能够更改这些详细信息并单击保存。但问题是它在控制台中显示以下错误:
**index.js:1 Warning: A component is changing a controlled input of type text to be uncontrolled.**
这是组件代码:
const Settings = (props) => {
const { createUser, isAuthenticated, history, errors } = props;
const dispatch = useDispatch();
const authUser = useSelector(state => state.auth.user);
const [user, setUser] = useState({
data: {
name: "",
email: "",
password: "",
},
});
const [error, setError] = useState({
nameError: "",
emailError: "",
passwordError: "",
});
useEffect(() => {
setUser({
data: {
email:authUser.email,
}
});
}, [authUser]);
const { name, email, password } = user.data;
const { nameError, emailError, passwordError } = error;
const onUpdateUser = (e) => {
e.preventDefault();
const isValid = formValidator(user.data, setError);
if (isValid) {
dispatch(updateUser(user.data))
}
};
const onChange = (e) => {
const { name, value } = e.target;
const { data } = user;
setUser({
data: {
...data,
[name]: value,
},
});
};
return (
<BForm title="Create an account" handleSubmit={onUpdateUser}>
{errors ? <p className="error-feedback">{errors}</p> : ""}
<BInput
name="name"
type="text"
handleChange={onChange}
value={name}
placeholder="Your Name"
error={nameError}
/>
<BInput
name="email"
type="email"
handleChange={onChange}
value={email}
placeholder="Email"
error={emailError}
required
/>
<BInput
name="password"
type="password"
value={password}
handleChange={onChange}
placeholder="Password"
error={passwordError}
required
/>
<div className="buttons">
<BButton customClass="login-btn" isfullwidth={true} type="submit">
{" "}
Save{" "}
</BButton>
</div>
</BForm>
);
};
export default Settings;
出了什么问题,如何解决?我需要让我们看到现有的值,然后改变他们想要的任何东西。
【问题讨论】:
-
检查您的
useEffect,它将user.data设置为只有email属性。例如,如果您随后将文本添加到password字段,则onChange处理程序将传播仅包含email的user.data,然后password由[name]: value设置,离开nameundefined= > 受控输入不受控制...? -
确实如此。只有三个字段;考虑为每个值使用单独的
useState。
标签: javascript reactjs ecmascript-6 react-hooks react-component