【发布时间】:2021-06-22 10:23:16
【问题描述】:
目前,我有许多复选框,这些复选框显然都与需要在 onSubmit 上传递的布尔值相关。我最初有这样的事情:
const [value, setValue] = React.useState({
alpha: true,
beta: false,
charlie: false,
// twenty or so more
});
...
<CheckboxComp
aria-label="id"
checked={value.alpha}
onChange={() => setValue({ alpha: !value.alpha})}
label="id"
/>
这让我大吃一惊:
Warning: A component is changing a controlled input to be uncontrolled. This is likely caused by the value changing from a defined to undefined, which should not happen. Decide between using a controlled or uncontrolled input element for the lifetime of the component.
然后我遇到了this。
- Through Input
const [state, setState] = useState({ fName: "", lName: "" });
const handleChange = e => {
const { name, value } = e.target;
setState(prevState => ({
...prevState,
[name]: value
}));
};
<input
value={state.fName}
type="text"
onChange={handleChange}
name="fName"
/>
<input
value={state.lName}
type="text"
onChange={handleChange}
name="lName"
/>
***************************
- Through onSubmit or button click
setState(prevState => ({
...prevState,
fName: 'your updated value here'
}));
这几乎和我得到的一样接近,但我在用输入字符串的东西切换真/假时遇到了麻烦。任何帮助,我知道这是一个愚蠢的问题,但它比继续使用 useState(false) x20 好得多,这是最远离优化的事情。
现在我有这样的东西!
const [value, setValue] = React.useState({
alpha: true,
beta: false,
charlie: false,
});
const handleChange = e => {
const { name, value } = e.target;
setValue(prevState => ({
...prevState,
[name]: value
}));
};
console.log(value)
...
<CheckboxComp
aria-label="id"
checked={value.alpha}
onChange={handleChange}
name="alpha"
label="id"
/>
但 console.log 显示
alpha: "true"
【问题讨论】:
-
这能回答你的问题吗? React - changing an uncontrolled input。此外,您的 onChange 调用
() => setValue({ alpha: !value.alpha})会覆盖除alpha之外的所有其他属性。
标签: javascript reactjs react-hooks