1、REACT 18开发文档有以下描述:

打开严格模式后,在开发过程中,Reaction会在实际设置之前额外运行一次安装和清理.

2、我有以下简单的代码


const GrandSon = () => {
  console.log('GrandSon')

  useEffect(() => {
    console.log('GrandSon mounted')
    return () => {
      console.log('GrandSon unmounted')
    }
  }, [])

  return <div>GrandSon</div>
}

const Son = () => {
  console.log('Son')

  useEffect(() => {
    console.log('Son mounted')
    return () => {
      console.log('Son unmounted')
    }
  }, [])

  return (
    <>
      <div>Son</div>
      <GrandSon />
    </>
  )
}

export default function App() {
  console.log('app')

  useEffect(() => {
    console.log('app mounted')
    return () => {
      console.log('app unmounted')
    }
  }, [])

  return (
    <div>
      <Son />
    </div>
  )
}

3、控制台将输出:

app
app
Son
Son
GrandSon
GrandSon
GrandSon mounted
Son mounted
app mounted
GrandSon unmounted
Son unmounted
app unmounted
GrandSon mounted
Son mounted
app mounted

4如我所料,、以下日志(log)输出

GrandSon mounted
Son mounted
app mounted
GrandSon unmounted
Son unmounted
app unmounted
GrandSon mounted
Son mounted
app mounted

但是我对开头部分有疑问

app
app
Son
Son
GrandSon
GrandSon

这是怎么发生的,请帮帮我!

推荐答案

当您在useEffect之外记录一些内容时,它很可能发生在组件的呈现阶段,而useEffect内部的代码在提交阶段执行.

以下是可能发生的情况的细目:

1-外部使用影响:

最初呈现组件时,useEffect外部的代码将在呈现阶段运行. 这就是为什么它似乎在组件完全挂载之前运行.

2-内部使用效果:

UseEffect中的代码在提交阶段运行,在呈现阶段之后. 这是通常会产生副作用的地方,例如数据提取、订阅或在挂载组件后应该发生的其他操作.

3-react 严格模式:

当您启用React Strict Mode时,它会在开发过程中执行额外的判断和警告,以帮助您捕获潜在的问题. 严格模式有意地双重调用某些函数,包括呈现方法和效果,以帮助检测副作用. 如果你观察到外部useEffect控制台日志(log)没有在React严格模式下运行,这可能是由于严格模式下的双重调用行为.

Reactjs相关问答推荐

如何实现黑暗模式 map ?

两条react 路由的行为不同.有没有人能解释一下,我已经找了好几天了

如何在整个应用程序中显示通用弹出窗口中的点击事件

为什么我得不到我想要的数据?

ReactJS:唯一项目的数量总和

错误:操作必须是普通对象.使用自定义中间件进行异步操作. Redux/工具包

状态改变不会触发重新渲染

React-apexcharts 中的 Y 轴刻度不会动态更新符号

使用以Jest 的方式返回 Promise 的方法来模拟可构造的 API 类时出现问题

Chart.js如何go 除边框

React - 使用 useEffect 还是直接在 onChange 方法中更改值对性能最好?

React 测试库 - 如何断言异步函数之间的中间状态?

作为单个变量的 React 组件是否比 memoized 组件渲染得更快?

如何通过onpress on view in react native flatlist来降低和增加特定视图的高度?

如何在react 中更新子组件中的变量?

如何解决在 react.js 中找不到模块错误

如何在react 日历中自定义带有圆形边框的日期项?

.filter() 函数在删除函数中创建循环 - React

React useEffect hooks return () => cleanup() vs return cleanup

Axios 删除在带有授权令牌的react js 中不起作用