我正在尝试设置一个事件在useEffect
:
useEffect(() => {
var input = document.getElementById("emailInput");
console.log(input); // null when reloading page!
input.addEventListener("keyup", function(event) {
console.log(event);
if (event.key === 'Enter')
onLogin();
});
}, []);
当我重新加载页面时,对input.addEventListener
的调用失败,因为input
的值是null
。我的理解是,useEffect
在组件渲染后运行,所以id="emailInput"
的输入元素应该已经存在了。我错过了什么?
更新:我是根据useEffect
中分配的东西有条件地渲染元素。我没有在问题中显示这部分,但没有显示的部分是问题…
你正在做的应该工作,所以我怀疑是拼写错误。
然而,作为一般规则,如果emailInput
是你的React应用程序的一部分,你应该在ref.
const inputRef = useRef();
useEffect(() => {
// do stuff with inputRef.current
}, [])
return <div><input ref={inputRef} /></div>
更好的是,根据你的例子,如果emailInput
是你React应用的一部分,你可以直接添加一个onKeyUp
作为道具。这样你可以跳过refs和useEffect
return <div><input onKeyUp={handleKeyUp} /></div>
如果你没有其他问题(如输入字段等)的地方,而不是删除事件可能会导致这个问题。
尝试像这样清理您的事件侦听器。
useEffect(() => {
var input = document.getElementById("emailInput");
console.log(input); // null when reloading page!
const yourFunc = (event) => {
console.log(event);
if (event.key === 'Enter') console.log('hello')
}
input.addEventListener("keyup", yourFunc);
return () => input.removeEventListener('keyup', yourFunc)
}, []);
是useEffect在组件渲染后运行