美文网首页
NextJS18+React中useEffect执行两次的原因及

NextJS18+React中useEffect执行两次的原因及

作者: ArslanRobot | 来源:发表于2023-10-27 06:50 被阅读0次

什么是useEffect

useEffect是React Hooks中的一个方法,它用于在函数式组件中执行ui以外的附加操作,例如从接口获取数据等,useEffect可以在组件挂载、更新或卸载时执行。

useEffect触发两次的原因

import { useEffect, useState } from "react"
const Upload = (prop: { children: any }) => {

  useEffect(() => {
    console.log("test")
    return () => {}
  }, []);
    
  return (
    <></>
  )
}

测试发现创建默认工程上面代码会输出两次test,究其原因是为了模拟立即卸载组件和重新挂载组件。帮助开发者提前发现重复挂载造成的Bug,提供的调试机制。

简单说,development mode + strict mode,开发环境帮你对每个组件模拟执行了如下操作,挂载->卸载->挂载的操作,为了帮你测试卸载时是否清理了需要释放的资源,例如挂载时开启了一个定时器,卸载时候记得释放掉,否则会无限循环执行。

useEffect(() => {
  const timer = setInterval(function(){ console.log("test") }, 2000)
  return () => {
    clearInterval(timer)
  }
}, []);

暴力解决方法

如果是React项目,修改index.tsx,去掉<React.StrictMode>标签

root.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>
)

改为

root.render(
  <App />
)

如果Nextjs 18工程,修改next.config.js增加reactStrictMode: false配置项

/** @type {import('next').NextConfig} */
const nextConfig = {
    reactStrictMode: false
}

module.exports = nextConfig

更好的解决方法

更好的解决方法还是兼顾,挂载->卸载->挂载,useEffect执行两次的方式去合理的初始化和释放资源,让一套代码兼容开发阶段的模拟模式和上线后的正式发布两种模式,适应react提供给你的这种完善的模拟调试模式。

相关文章

  • react18 useEffect 首屏执行两遍的问题

    react 18 dev环境严格模式下首屏 useEffect会执行两次 不用严格模式

  • Hooks API

    useEffect useEffect的使用 参考上篇文章 执行时机: useEffect可以看做componen...

  • 解决useEffect调接口重复请求的问题

    useEffect的执行机制,是比较两次依赖项是否相同,不同则执行相关effect。 思路1: 查看父组建有没有多...

  • Error: Rendered fewer hooks than

    原因 在执行组件时,如果isArrived时,直接返回了,导致下面的两个useEffect没能执行 解决 去掉任何...

  • react18 useEffect 执行两次

    最近用React18做了个项目,发现这种情况下的log会执行两次 查找资料发现:image.png 解决方法:取消...

  • React Effect Hook用法详解

    useEffect简介 useEffect,字面意思可以理解为"执行副作用操作",对比于以前react class...

  • useLayoutEffect

    简介 1 .类似于useEffect。区别就是执行的时机2 .useEffect不会阻塞浏览器的绘制任务,他会在页...

  • useEffect

    使用useEffect完成副作用操作。赋值给useEffect的函数会在组件渲染到屏幕之后执行。 在函数组件主体内...

  • useEffect & useLayoutEffect

    useEffect useEffect 用来执行副作用操作,副作用可以理解为对环境做出影响的操作,比如数据获取,设...

  • useEffect, useCallback, useMemo三

    useEffect useEffect可以帮助我们在DOM更新完成后执行某些副作用操作,如数据获取,设置订阅以及手...

网友评论

      本文标题:NextJS18+React中useEffect执行两次的原因及

      本文链接:https://www.haomeiwen.com/subject/yemuidtx.html