React Hooks(useEffect)

39 阅读1分钟
import React, { useEffect, useRef, useState } from 'react';
import { Stack } from 'expo-router';



export default function RootLayout() {

  console.log("开始执行")
  const [msg, setMsg] = useState('https://apis.tianapi.com/bulletin/index?key=9fb2e0558e073ccf65e83eb18b4add2a')

  function updateConn() {
    console.log("updateConn-on-Before", msg)
    setMsg("http://www.baidu.com")
    console.log("updateConn-on-After", msg)
  }

  function updateConn2() {
    console.log("updateConn2-on-Before", msg)
    setMsg("https://www.bilibili.com/")
    console.log("updateConn2-on-After", msg)

  }


  useEffect(() => {
    console.log("进入了useEffect")
    console.log("updateConn--Before", msg)
    updateConn()
    console.log("updateConn--After", msg)

    return () => {
      console.log("updateConn2--Before", msg)
      updateConn()
      console.log("updateConn2--After", msg)
    }
  })

  console.log("结束执行", msg)

 
  
  return (
    <Stack>
      <Stack.Screen name="(tabs)" options={{ headerShown: false }} />
    </Stack>
  );
}

前提前要useEffect第二个参数必须是数组,这个数组在useEffect中叫依赖数组

  • useEffect第二个参数为空数组的时候,return是不执行的
  • useEffect第二个参数有值的时候,return是执行的
  • useEFfect只有一个参数,也就是只有一个函数的时候,return是执行的
  • useEffect第二个参数为空数组的时候,只运行一次
  • useEffect第二个参数有值的时候,每当useState发生变化的时候,才会发生改变
  • useEffect只有一个参数,不依赖任何,每次都运行
  • useEffect第一个参数中, retrun内 是组件卸载执行,retrun外是组件渲染执行

在useEffect中有一个特殊的报错叫循环依赖,以下是常规解决办法

  • constructor依赖注入(不推荐)
  • 采用oop模块化设计
  • 模块之间采用松耦合
  • 采用Mobx,这里注意一下,Mobx不是Pinia和Vuex一样贮存在内存中,Mobx是响应式是开发
  • 采用Proxy代理方式