Skip to content

react hooks useEffect 使用浅析

Updated: at 01:05 PM

💡:可以让你完成一些类似于class中生命周期的功能

简单使用规则

import React, { memo, useState, useEffect } from "react";
export default memo(function App() {
  const [count, setCount] = useState(200);
  useEffect(() => {
    //当前传入的回调函数会在组件被渲染完成后,自动执行
    document.title = count;
  });
  return (
    <div>
      <h2>当前计数: {count}</h2>
      <button onClick={e => setCount(count + 1)}>+1</button>
    </div>
  );
});

为什么effect中需要返回一个函数,清除副作用代码

import React, { memo, useEffect, useState } from "react";
export default memo(function App() {
  const [count, setCount] = useState(0);
  //负责告知react,在执行完当前组件渲染之后要执行的副作用代码
  useEffect(() => {
    //1.监听事件
    console.log("监听redux中数据变化,监听eventBus中的why事件");
    // 返回值:回调函数 => 组件被重新渲染或者组件卸载的时候执行
    return () => {
      console.log("取消监听redux中数据变化,取消监听eventBus中的why事件");
    };
  });
  return (
    <div>
      <button onClick={e => setCount(count + 1)}>+1({count})</button>
    </div>
  );
});

异步效果(Async Effects)

import React, { useEffect } from "react";
useEffect(
  () => {
    const fetchData = async () => {
      // 执行异步操作
      const result = await someAsyncFunction();
      // 处理异步操作的结果
    };
    fetchData();
    // 你也可以直接在 useEffect 内部调用异步函数
    // someAsyncFunction().then(result => { /* 处理异步操作的结果 */ });
  },
  [
    /* 依赖数组 */
  ]
);

Effect 的条件执行

import React, { useState, useEffect } from "react";
function ExampleComponent() {
  const [data, setData] = useState(null);
  const [fetchData, setFetchData] = useState(false);
  useEffect(() => {
    if (fetchData) {
      // 执行数据获取逻辑
      fetchDataFromAPI().then(result => {
        setData(result);
      });
    }
  }, [fetchData]); // 仅在 fetchData 发生变化时执行
  const handleButtonClick = () => {
    setFetchData(true); // 在按钮点击时设置 fetchData 为 true,触发 effect 执行
  };
  return (
    <div>
      <button onClick={handleButtonClick}>Fetch Data</button>
      {data && <p>{data}</p>}
    </div>
  );
}
export default ExampleComponent;