我是靠谱客的博主 英俊芒果,最近开发中收集的这篇文章主要介绍React18中使用useEffect初始执行2次,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

出现问题:

由于新版React推荐使用函数式组件,旧版本的React的类式组件的一些钩子和路由组件都无法继续使用,取而代之的是hooks

今天在使用React18,兼容以前旧版本的React的时候,需要将componentDidMount等钩子,使用useEffect这个hooks代替

//以下代码为伪代码
const navigate = useNavigate()
const [self_open,setSelf_open] = useState(true);
 useEffect(()=>{
        if(isTrue()){
            getSelf().then((res)=>{
                setSelf_open(res.data.open)
            })
        }
        else{
            message.error("无法访问!");
            console.log("无法访问!")
            navigate("/text")
        }
    },[])

代码大概业务就是,组件加载完成,判断是否符合要求,符合要求则请求后端接口,修改状态,否则弹窗并且跳转路由

按照我原本想法,使用useEffect,监听空数组,也就是使其初始化的时候执行一次,相当于类式组件中的componentDidMount,在测试不符合要求的情况下的时候,发现弹窗2次,输出了2次,起初以为是程序的bug。后来通过查阅React官网发现造成这种情况的原因

  • 这是React18的新特性,只有在开发模式下且使用了严格模式才会触发2次,生产环境与原来一样
  • 执行2次是为了模拟立即卸载组件和重新挂载组件
  • React未来会增加特性,允许其保留状态的同时能够做到仅仅删除或者添加UI部分

解决方案:

方法1:同时也是最简单的方法,在index.js中取出StrictMode,关闭严格模式

方法2:按照React官方的说法

The right question isn’t “how to run an Effect once,” but “how to fix my Effect so that it works after remounting”.

React官方是希望我们解决重复挂载卸载,useEffect支持返回函数,可以在组件卸载额时候执行函数,通常可以实现清理函数并在useEffect返回。

最后

以上就是英俊芒果为你收集整理的React18中使用useEffect初始执行2次的全部内容,希望文章能够帮你解决React18中使用useEffect初始执行2次所遇到的程序开发问题。

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

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

评论列表共有 0 条评论

立即
投稿
返回
顶部