我是靠谱客的博主 直率康乃馨,最近开发中收集的这篇文章主要介绍React Hook中useState更新延迟问题方法一:  去掉useEffect的第二个参数方法二: 将改变函数移入useEffect并将第二个参数设置为state方法三: 如果不在意视图实时渲染 采用Ref代替useState或者全局变量,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

例如以下代码 错误实例


   
   
  1. const[zoom, setZoom] = useState( 0);
  2. useEffect(() = >{
  3. document.getElementById( 'workspace-content').addEventListener( 'mousewheel', scrollFunc);
  4. },[]);
  5. function scrollFunc(e) {
  6. setZoom(zoom + 5)
  7. }

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

怎么解决呢?

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


   
   
  1. const[zoom, setZoom] = useState( 0);
  2. useEffect(() = >{
  3. document.getElementById( 'workspace-content').addEventListener( 'mousewheel', scrollFunc);
  4. return () = > document.getElementById( 'workspace-content').removeEventListener( "mousewheel", scrollFunc); // 记得解绑事件
  5. });
  6. function scrollFunc(e) {
  7. setZoom(zoom + 5)
  8. }

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

依旧用上面的例子

解决方法: 正确示例


   
   
  1. useEffect(() = >{
  2. document.getElementById( 'workspace-content').addEventListener( 'mousewheel', scrollFunc);
  3. return () = > document.getElementById( 'workspace-content').removeEventListener( "mousewheel", scrollFunc);
  4. function scrollFunc(e) {
  5. setZoom(zoom + 5) e.preventDefault()
  6. }
  7. },[zoom]);

方法三: 如果不在意视图实时渲染 采用Ref代替useState或者全局变量

例如下面的代码 错误示例


   
   
  1. const [currentIndex, setCurrentIndex] = useState( 0)
  2. const handleLeft = () => {
  3. setCurrentIndex(currentIndex+ 1)
  4. console.log(currentIndex)
  5. }

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

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

解决方案: 用useRef代替


   
   
  1. const currentIndexRef = useRef( 0); // 不能用useState 会导致数据更新不及时
  2. const handleLeft = () => {
  3. currentIndexRef.current += 1
  4. console.log(currentIndexRef.current)
  5. }

 

 

最后

以上就是直率康乃馨为你收集整理的React Hook中useState更新延迟问题方法一:  去掉useEffect的第二个参数方法二: 将改变函数移入useEffect并将第二个参数设置为state方法三: 如果不在意视图实时渲染 采用Ref代替useState或者全局变量的全部内容,希望文章能够帮你解决React Hook中useState更新延迟问题方法一:  去掉useEffect的第二个参数方法二: 将改变函数移入useEffect并将第二个参数设置为state方法三: 如果不在意视图实时渲染 采用Ref代替useState或者全局变量所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(41)

评论列表共有 0 条评论

立即
投稿
返回
顶部