const [name, setName] = useState('');
<input value={name}
onChange={e => setName(e.target.value)} />
React 输入框敲键盘完全没反应光标也不动,控制台报 Warning: You provided a `value` prop to a form field without an `onChange` handler. This will render a read-only field,这类只读警告一般出现在复制来的表单代码里。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。
原因不复杂,value 由 state 固定住,输入事件没有更新 state,每次渲染又把输入框写回原值,看着就像键盘失灵,其实是被渲染回去了,不是浏览器或输入法的问题。
围绕「受控组件无法输入」排查时,命令行跑一遍比在面板里点十次有用,面板会替你做掉不少隐式操作。备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。
接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。
处理上按这个顺序:给输入框补上 onChange,把每次输入都写回 state,别只写 value;多个字段用 name 统一处理,减少大段重复代码,也少出错;只想给一个初始值时改用 defaultValue,别用 value 固定住。
改完只确认一件事:输入内容实时显示在框里,控制台不再出现只读字段警告,光标也正常。
