Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何防止react-onClick函数的状态更新(外部useEffect)?_Javascript_Reactjs_Scope_Use Effect - Fatal编程技术网

Javascript 如何防止react-onClick函数的状态更新(外部useEffect)?

Javascript 如何防止react-onClick函数的状态更新(外部useEffect)?,javascript,reactjs,scope,use-effect,Javascript,Reactjs,Scope,Use Effect,当我使用useffect时,我可以通过将这样的变量置零来防止未安装组件的状态更新 useffect(()=>{ 活动常量={state:true} //... 如果(!alive.state)返回 //... return()=>(alive.state=false) } 但是,当我使用一个通过点击按钮调用的函数时(在外部useffect),如何做到这一点呢 例如,此代码不起作用 export const mycop=()=>{ 活动常量={state:true} useffect(()=>{

当我使用
useffect
时,我可以通过将这样的变量置零来防止未安装组件的状态更新

useffect(()=>{
活动常量={state:true}
//...
如果(!alive.state)返回
//...
return()=>(alive.state=false)
}
但是,当我使用一个通过点击按钮调用的函数时(在外部
useffect
),如何做到这一点呢

例如,此代码不起作用

export const mycop=()=>{
活动常量={state:true}
useffect(()=>{
return()=>(alive.state=false)
}
const onclickthit=async()=>{
const response=wait letsbehere5seconds()
如果(!alive.state)返回
setSomeState('嘿')
//警告,因为这里的alive.state为真,
//…与useEffect变量不同
}
}
还是这个

export const mycop=()=>{
活动常量={}
useffect(()=>{
alive.state=true
return()=>(alive.state=false)
}
const onclickthit=async()=>{
const response=wait letsbehere5seconds()
如果(!alive.state)返回//alive.state未定义,则返回
setSomeState('嘿')
}
}

当组件重新呈现时,它将对当前上下文的变量进行垃圾收集,除非它们的状态为“已满”。如果您希望在呈现期间保留一个值,但不希望在更新时触发重新呈现,请使用
useRef
挂钩。


当onClick处理程序仍在处理时,是什么导致组件无法装入?可能会将逻辑从click处理程序移动到拥有它的组件。当超时2秒显示modalSorry时,只需快速单击一下,我想我的重点更多的是弄清楚为什么会发生这种情况,以防止出现场景In不要只是治疗症状和使用权宜之计。你的观点完全正确,但在模式场景中,除了使用这些权宜之计之外,如果用户在显示消息的模式下快速单击,我真的看不出我如何防止警告。我猜你还没有清楚地解释该场景。是不是有点像模式是dis已播放,被解雇后“逗留”片刻,一个不耐烦的用户有点高兴吗?我刚用
useState
检查过,但很明显,当我更新它时,我导致了一个重播,
useRef
没有,您的解决方案工作得很好,谢谢!!
export const MyComp = () => {

  const alive = useRef(false)
  useEffect(() => {
   alive.current = true
   return () => (alive.current = false)
  }

  const onClickThat = async () => {
    const response = await letsbehere5seconds()
    if (!alive.current) return
    setSomeState('hey') 
  }
}