我的编程空间,编程开发者的网络收藏夹
学习永远不晚

关于reactuseState更新异步问题

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

关于reactuseState更新异步问题

react useState更新异步

当我们使用react中useState这个hook时候,如下

const [page, setPage] = useState(1);
const handlerClick = (e)=>{
    setPage(e.current);
    console.log(page);
}

当我打印page时候,此时page还是1,因为useState的更新是异步的,这和react的机制有关,要解决这个可以这样做

1.使用useState的返回值

 setPage(e.current);
        setPage(prevFoo => {
            console.log('page===========',prevFoo);//page=========== 2
            return prevFoo;
 });

2.自定义hook(第一种方式)

    const useSyncCallback = callback => {
        const [proxyState, setProxyState] = useState({ current: false });
        const Func = useCallback(() => {
          setProxyState({ current: true });
        }, [proxyState]);
        useEffect(() => {
          if (proxyState.current === true) {
            setProxyState({ current: false });
          }
        }, [proxyState]);
        useEffect(() => {
          proxyState.current && callback();
        });
        return Func;
      };
      const funcqq = useSyncCallback(() => {
        console.log('page===========',page);//page=========== 2
      });
//调用
setPage(e.current);
funcqq()

自定义hook(第二种方式)

function useCurrentValue(value) {
    const ref = useRef(value);
    useEffect(() => {
      ref.current = value;
    }, [value]);
    return ref;
}
//调用
 const log = () => {
    setCount(count + 1);
    setTimeout(() => {
      console.log(currentCount.current);
    }, 3000);
  };

3.使用useRef替代useState,第三种方式在自定义hook第二种方式里面已经体现了

4.使用useEffect,在自定义hook第二种方式里面已经体现了

记useState异步更新小坑

问题

在hooks中,修改状态的是通过useState返回的修改函数实现的.它的功能类似于class组件中的this.setState().而且,这两种方式都是异步的.可是this.setState()是有回调函数的,那useState()呢?

问题点

它异步且没有回调函数

const [count,setCount] = useState(1)
useEffect(()=> {
    setCount(2,()=>{
      console.log('测试hooks的回调');
    })
    console.log(count);
  },[])

打印信息

可以看到提示 “State updates from the useState() and useReducer() Hooks don’t support the second callback argument. To execute a side effect after rendering, declare it in the component body with useEffect().”

是不支持回调函数的形式的。因为setCount是异步的,所以打印count是在改变count之前的。

如果我们想要在打印的时候就拿到最新的值,那么我们可以通过setCount的第二个参数指定依赖项

const [count,setCount] = useState(1)
useEffect(()=> {
    setCount(2)
    console.log(count);
  },[count])

当count发生变化的时候,useEffect就会再次相应,但是这样就会有个问题,当count从1变为2的时候useEffect的回调函数会再次执行,就会分别打印1,2两次。

  useEffect(()=> {
    let currentValue = null
      setCount((preVal)=>{
        currentValue=preVal
        return 2
      })
      if(currentValue!==count){
        console.log(count);
      }
    },[count])

通过添加判断条件,我们可以让想要执行的代码只执行一次

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

关于reactuseState更新异步问题

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

关于reactuseState更新异步问题

这篇文章主要介绍了关于reactuseState更新异步问题,具有很好的参考价值,希望对大家有所帮助。以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
2022-11-13

关于mybatis resulttype 返回值异常的问题

目录mybatisresulttype返回值异常例如:resulttype="student"但是当中有些字段为空例如:数据库字段为:s_name实体类字段为namemybatisresultType="map"的常见问题一、map的key值与select的字
2015-02-25

关于Java异常最常见的八大问题

1.异常管理的最佳做法如果可以正确处理异常,则应该被捕获,否则应该抛出异常。2.为什么try中定义的变量不能用于catch或finally?try {File file = new File(“path”);FileInputStream
2023-06-02

Android 关于ExpandableListView刷新问题的解决方法

正文 首先是最基础的ExpandableListView vList = (ExpandableListView) this.findViewById(R.id.list); EListAdapter adapter = new EList
2022-06-06

关于react中列表渲染的局部刷新问题

这篇文章主要介绍了关于react中列表渲染的局部刷新问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2022-11-13

编程热搜

目录