[英]How to remove specific item from react state
我正在尝试从我的反应 state 中删除特定项目。
当前行为:
当某些复选框被选中时,我正在更新他们的 state。 我的 useEffect 有复选框 state 用于他的依赖项,并且每次更改我只为选定的复选框添加内容。
预期结果:
当我取消选中某个复选框时,我想从“状态”state 中删除特定键。
Codesandbox 例如: https://codesandbox.io/s/priceless-rgb-bon2f?file=/src/App.js
我怎样才能删除它? 谢谢你。
您可以在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;
});
};
要添加新属性,请使用扩展运算符创建新 object 并添加新属性和新值:
{ ...prev, [name]: `new value of ${name}` }
要删除旧属性,请在解构中使用计算的 object 属性名称和 rest丢弃一个:
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]);
您可以制作一个新的 object 并将其设置为新的 object。 像这样。
const newObject = Object.keys(state).reduce((object, item) => {
if (item !== key) {
object[item] = state[item];
}
return object;
}, {});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.