ReactHook中useState更新延迟问题及解决.docx

ReactHook中useState更新延迟问题及解决.docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

ReactHook中useState更新延迟问题及解决

目录ReactHook中useState更新延迟ReactHookuseState连续更新对象问题

ReactHook中useState更新延迟

方法一:去掉useEffect的第二个参数

例如以下代码错误实例

const[zoom,setZoom]=useState(0);

useEffect(()={

??document.getElementById(workspace-content).addEventListener(mousewheel,scrollFunc);

},[]);

functionscrollFunc(e){

??setZoom(zoom+5)

}

会出现zoom永远等于0+5,而不是所谓的5,10,15为什么会这样呢因为useEffect执行时,会创建一个闭包,在每次监听到mousewheel运行时闭包内部保存了zoom的初始化值每次调用的时候都是取的初始化值0所有会一直为0+5

怎么解决呢

解决方案:去掉useEffect中的空数组即可

const[zoom,setZoom]=useState(0);

useEffect(()={

??document.getElementById(workspace-content).addEventListener(mousewheel,scrollFunc);

??return()=document.getElementById(workspace-content).removeEventListener(mousewheel,scrollFunc);//记得解绑事件

functionscrollFunc(e){

??setZoom(zoom+5)

}

方法二:将改变函数移入useEffect并将第二个参数设置为state

依旧用上面的例子

解决方法:正确示例

useEffect(()={

??document.getElementById(workspace-content).addEventListener(mousewheel,scrollFunc);

??return()=document.getElementById(workspace-content).removeEventListener(mousewheel,scrollFunc);

??functionscrollFunc(e){

????setZoom(zoom+5)e.preventDefault()

??}

},[zoom]);

方法三:使用Ref,在useEffect内监听此ref,并实时跟useState同步

例如下面的代码错误示例

const[currentIndex,setCurrentIndex]=useState(0)

?consthandleLeft=()={

???setCurrentIndex(currentIndex+1)

???console.log(currentIndex)

?}

初始化currentIndex为0每次执行handleLeft函数是让currentIndex加1,之后立即获取currentIndex的值发现第一次执行currentIndex=0

第二次执行currentIndex=1每次都跟实际情况差一个查阅资料发现useState必须要执行完react整个生命周期才会获取最新值

解决方案:用useRef中转,并实时同步给useState

const[currentIndex,setCurrentIndex]=useState(0)

constcurrentIndexRef=useRef(0);

?consthandleLeft=()={

???currentIndexRef.current+=1

???console.log(currentIndexRef.current)

useEffect(()={

??setCurrentIndex(currentIndexRef.current)

},[currentIndexRef.current])

ReactHookuseState连续更新对象问题

reacthook的useState更新是异步的,所以在连续更新出发useState时会出现问题

eg

文档评论(0)

135****8957 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档