useEffect

useEffect( 回调函数, 依赖项 )

作为组件挂载后执行的操作

类似于Vue的mounted,在组件挂载的时候执行的操作

此时依赖项为一个空数组: useEffect(()=>{ 函数体 }, [])

import React, { useEffect } from 'react';

function App() {

  useEffect(() => {
    // 最常见的用法就是网络请求
    // 第一个参数是一个回调函数,用于执行挂载这个组件时候的操作
    axios.get('https://api.example.com/data')
    .then(response => {
      setData(response.data);
    })
    .catch(error => {
      console.error('Error fetching data:', error);
    });
    // 此时useEffect第二个参数为空数组
  }, []);

  return (
    <div>
      {/* 组件内容 */}
    </div>
  );
}

export default App;

作为更新的钩子函数

类似于Vue的updated,在组件发生更新的时候执行

此时依赖项为空(不需要依赖项): useEffect(()=>{ 函数体 })

注意,组件挂载的时候也会执行

import { useEffect, useState } from "react";

function App() {

  useEffect(()=>{
    console.log("onUpdate!");
  })

  const [cnt, setCnt]=useState(0)

  return (
    <div>
      <button onClick={()=>setCnt(cnt+1)}>测试按钮: {cnt}</button>
    </div>
  );
}

export default App;

作为依赖项监听的钩子函数

类似于Vue的watch,在特定的变量发生变化的时候执行

此时依赖项为需要监听的变量: useEffect(()=>{ 函数体 }, [变量1, 变量2, ...])

注意,组件挂载的时候也会执行

import { useEffect, useState } from "react";

function App() {

  const [cnt, setCnt]=useState(0)

  useEffect(()=>{
    console.log("onUpdate!");
  }, [cnt])
  

  return (
    <div>
      <button onClick={()=>setCnt(cnt+1)}>测试按钮: {cnt}</button>
    </div>
  );
}

export default App;

如果不希望在挂载的时候执行回调函数,可以添加一个变量判断是否挂载完成:

import { useEffect, useState } from "react";

function App() {

  const [cnt, setCnt]=useState(0);
  const [init, setInit]=useState(false);

  useEffect(()=>{
    if(!init){
      setInit(true);
    }else{
      console.log("onUpdate!");
    }
  }, [cnt])
  

  return (
    <div>
      <button onClick={()=>setCnt(cnt+1)}>测试按钮: {cnt}</button>
    </div>
  );
}

export default App;

清除副作用

import { useEffect } from "react";

function App() {


  useEffect(()=>{
    return ()=>{
      // 在清除这个组件的时候自动执行这个操作
      // 多用于清理计时器等功能
    }
  })
  

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

export default App;