【发布时间】:2019-09-15 10:27:17
【问题描述】:
我在 React 的输入字段中遇到了一个奇怪的问题。我知道hidden 输入不会触发input 或change 事件。但是,即使我手动触发它们,React 的 onChange 事件仍然没有被调用。
我在这里同时触发change 和input 事件,因为React 的onChange 实际上是input 事件。当我出于测试目的在inputRef (addEventListener("change", () => { ... })) 上设置事件侦听器时,调用它时不会出现问题。然而,事实证明 React 在拦截它时遇到了一些问题。
这是我当前的代码:
const [fieldValue, setFieldValue] = useState(0);
const inputRef = useRef<HTMLInputElement>(null);
const handleClick = useCallback((): void => {
if (inputRef.current) {
inputRef.current.dispatchEvent(new Event("change", { bubbles: true }));
inputRef.current.dispatchEvent(new Event("input", { bubbles: true }));
}
setFieldValue(prev => prev + 1);
}, []);
JSX:
<input type="hidden" ref={inputRef} value={fieldValue} onChange={(e) => { console.log("React:onChange"); }} />
<button type="button" onClick={handleClick}>Hit it</button>
我在这里做错了吗?我还需要做什么才能正确触发 React 的 onChange 事件?
【问题讨论】:
-
如果能放入codesandbox就好了
-
为什么需要
ref?看起来你的fieldValue处于状态,你应该在onChange中设置新状态,点击按钮时只需获取当前状态值,它将保持当前输入值 -
@KryštofŘeháček 这些有什么关系?我触发更改,而不是寻找解决方案如何做到这一点。
-
@quirimmo 我会将
ref用于其他目的,例如 HTML5 验证等,因此我需要访问 DOM 对象。
标签: javascript reactjs typescript dom-events