Javascript 为什么函数不能在ReactJS中的eventlistener中作为引用传递
我在ReactJS中使用功能组件Javascript 为什么函数不能在ReactJS中的eventlistener中作为引用传递,javascript,reactjs,dom-events,ref,Javascript,Reactjs,Dom Events,Ref,我在ReactJS中使用功能组件 const[showState,setState]=useState(); useffect(()=>{ document.addEventListener('click',handleClick); return()=>{ document.removeEventListener('click',handleClick); } }, []); 函数handleClick(事件){ console.log(showState); }; 函数toggleStat
const[showState,setState]=useState();
useffect(()=>{
document.addEventListener('click',handleClick);
return()=>{
document.removeEventListener('click',handleClick);
}
}, []);
函数handleClick(事件){
console.log(showState);
};
函数toggleState(){
设置状态(真);
}
报税表(<
按钮onClick={
切换状态
}>切换
)
当您创建函数handleClick
时,它通过闭包捕获showState
的值,并且该值在第一次渲染时未定义。但当您调用toggleState
时,React不会更改showState
的值,而是使用新值重新呈现组件,并使用捕获的新值创建handleClick
的新实例。但是,全局侦听器仍然使用未定义的存储函数的旧版本
您可以使用useRef
或将handleClick
包装到useCallback
中,并将其作为依赖项添加到useffect
中,以获得所需的结果
useRef
允许您在渲染之间保留引用:
const showState=useRef();
函数handleClick(事件){
console.log(showState.current);
};
函数toggleState(){
showState.current=true;
}
但是,您应该记住,useRef
不会触发重新渲染
使用useCallback
:
const[showState,setState]=useState();
const handleClick=useCallback(()=>{
console.log(showState);
},[showState]);
useffect(()=>{
document.addEventListener('click',handleClick);
return()=>{
document.removeEventListener('click',handleClick);
}
},[handleClick]);
这样,每次showState
更改创建的handleClick
的新实例时,在闭包中使用新值,useffect
被触发,重新连接事件侦听器。尝试禁用useCapture
,方法是将false
传递给addEventListener
@bertdida它不起作用