React重用事件。当您使用功能更新时,在调用该函数时,该事件已被擦除以供重用。要在功能更新中使用该事件,您需要调用e.persist()它来将该事件从重用池中取出并让它保留其值。
为了保持内联,它看起来像这样:
onChange={e => {e.persist(); setBalance(form => ({...form, [e.target.value]: e.target.value}))}}
或者为了使其更具可读性,将其移动到自己的函数中:
const onChange = (e) => {
e.persist();
setBalance(form => ({...form, [e.target.value]: e.target.value}));
}
但是,最简单的可用解决方案是根本不使用功能更新。您正在替换状态值,但没有设置从先前状态派生的任何值。所以使用正常更新是安全的:
onChange={e => setBalance({...balance, [e.target.value]: e.target.value})}
现在事件重用不是问题。
旁注: [e.target.value]: e.target.value这真的没有意义。您正在将具有新值名称的对象键设置为相同的值。
似乎您以前看过[e.target.name]: e.target.value并修改过它。我建议使用名称,然后给出input要更新的属性的名称。
这是一个简化的示例:
const {useState, useEffect} = React;
const Example = () => {
const [state, setState] = useState({ input1: '' });
const onChange = (e) => {
setState({[e.target.name]: e.target.value});
}
return (
<input
name="input1"
placeholder="enter balance here"
onChange={onChange}
value={state.input1}
/>
);
}
ReactDOM.render(<Example />, document.getElementById('root'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.4/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.4/umd/react-dom.production.min.js"></script>
<div id="root"></div>