您可以在handleChange 中进行操作。
-
删除未选中,即对象中的
false 属性名称。或者...
-
添加选中,即对象中的
true属性名称
const handleChange = (event) => {
const { name, checked } = event.target;
setState((prev) => {
if (checked) {
return { ...prev, [name]: `new value of ${name}` }; // Adding a new property
}
const { [name]: namesValue, ...rest } = prev; // Removing an old property
return rest;
});
};
说明:
要添加新属性,请使用扩展运算符创建一个新对象并添加新属性和新值:
{ ...prev, [name]: `new value of ${name}` }
要删除旧属性,丢弃一个使用计算对象属性名称并在解构中休息:
const { [name]: namesValue, ...rest } = prev;
演示:
function App() {
const [state, setState] = React.useState({
a: "initial value of a",
b: "initial value of b"
})
const [checked, setChecked] = React.useState({
a: true,
b: true,
})
const handleChange = (event) => {
const { name, checked } = event.target
setState((prev) => {
if (checked) {
return { ...prev, [name]: `new value of ${name}` }
}
const { [name]: namesValue, ...rest } = prev
return rest
})
setChecked((prev) => ({ ...prev, [name]: checked }))
}
return (
<div className="App">
<label htmlFor="a">a</label>
<input
name="a"
checked={checked.a}
type="checkbox"
id="a"
onChange={handleChange}
/>
<label htmlFor="b">b</label>
<input
name="b"
checked={checked.b}
type="checkbox"
id="b"
onChange={handleChange}
/>
<div>{JSON.stringify(state)}</div>
</div>
)
}
ReactDOM.render(<App />, document.getElementById('root'))
<script crossorigin src="https://unpkg.com/react@17/umd/react.production.min.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@17/umd/react-dom.production.min.js"></script>
<body>
<div id="root"></div>
</body>
编辑:
如果你想有一个单独的useEffect钩子来管理属性的添加/删除,你可以使用reduce如下:
useEffect(() => {
setState((prev) => {
return Object.keys(checked).reduce((obj, key) => {
if (checked[key]) {
obj[key] = prev[key] ?? `new value of ${key}`;
}
return obj;
}, {});
});
}, [checked]);