13 React useEffect 详解

useEffect 是 React 中用于处理副作用操作的 Hook。副作用包括数据获取、订阅操作、手动修改 DOM 等。以下是一些 useEffect 的示例以及需要注意的知识:

1. 数据获取

import React, { useState, useEffect } from 'react';

function DataFetching() {
  const [data, setData] = useState(null);

  useEffect(() => {
    const fetchData = async () => {
      const response = await fetch('https://api.example.com/data');
      const result = await response.json();
      setData(result);
    };

    fetchData();
  }, []); // 空数组作为依赖表示只在组件挂载时执行一次

  return (
    <div>
      {data && <p>Data: {data}</p>}
    </div>
  );
}
  • 需要注意的知识:
    • 异步操作应当在 useEffect 内部进行,以确保在组件渲染完成后执行。
    • 使用空依赖数组 [] 可以确保 useEffect 仅在组件挂载时执行一次。

2. 订阅操作

import React, { useState, useEffect } from 'react';

function Subscription() {
  const [count, setCount] = useState(0);

  useEffect(() => {
    const intervalId = setInterval(() => {
      setCount(prevCount => prevCount + 1);
    }, 1000);

    return () => {
      clearInterval(intervalId);
    };
  }, []); // 空数组作为依赖表示只在组件挂载时执行一次

  return (
    <div>
      <p>Count: {count}</p>
    </div>
  );
}
  • 需要注意的知识:
    • useEffect 可以返回一个清理函数,在组件销毁时执行,用于清除副作用,比如取消订阅、清除定时器等。

3. 监听属性变化

import React, { useState, useEffect } from 'react';

function PropChanges({ prop }) {
  const [count, setCount] = useState(0);

  useEffect(() => {
    setCount(count + 1);
  }, [prop]); // 当 prop 变化时触发 useEffect

  return (
    <div>
      <p>Count: {count}</p>
    </div>
  );
}
  • 需要注意的知识:
    • 通过传递一个包含变量的数组作为 useEffect 的依赖,可以监听该变量的变化并执行相应的副作用操作。

4. 手动修改 DOM

import React, { useEffect } from 'react';

function DOMManipulation() {
  useEffect(() => {
    document.title = 'New Title';
    return () => {
      document.title = 'Original Title';
    };
  }, []); // 空数组作为依赖表示只在组件挂载时执行一次

  return (
    <div>
      <p>DOM Manipulation Example</p>
    </div>
  );
}
  • 需要注意的知识:
    • useEffect 内部可以进行一些 DOM 操作,但是需要确保操作不会导致 React 和 DOM 同步问题。
    • 返回的清理函数可以用来恢复原始状态,以避免内存泄漏或者其他副作用。

5. 使用多个 useEffect

import React, { useState, useEffect } from 'react';

function MultipleEffects() {
  const [count, setCount] = useState(0);
  const [data, setData] = useState(null);

  useEffect(() => {
    // effect for count
    document.title = `Count: ${count}`;

    return () => {
      document.title = 'Original Title';
    };
  }, [count]); // 当 count 变化时触发 useEffect

  useEffect(() => {
    // effect for data
    const fetchData = async () => {
      const response = await fetch('https://api.example.com/data');
      const result = await response.json();
      setData(result);
    };

    fetchData();

    return () => {
      // cleanup for data
    };
  }, []); // 空数组作为依赖表示只在组件挂载时执行一次

  return (
    <div>
      <p>Count: {count}</p>
      {data && <p>Data: {data}</p>}
      <button onClick={() => setCount(count + 1)}>Increment</button>
    </div>
  );
}
  • 需要注意的知识:
    • 可以在同一个组件中使用多个 useEffect,每个 useEffect 之间相互独立。
    • 每个 useEffect 可以有自己的清理函数。

useEffect 的依赖可以分为三种情况:

  1. 空依赖数组:表示 useEffect 仅在组件挂载时执行一次。
  2. 包含具体依赖的数组:表示 useEffect 会在指定依赖发生变化时执行。
  3. 没有依赖数组:表示 useEffect 在每次组件渲染时都会执行。

下面是针对每种情况的详细示例以及注意知识:

1. 空依赖数组

import React, { useState, useEffect } from 'react';

function EmptyDependencyExample() {
  const [count, setCount] = useState(0);

  useEffect(() => {
    console.log("Component mounted");
    return () => {
      console.log("Component unmounted");
    };
  }, []); // 空依赖数组表示仅在组件挂载和卸载时执行

  return (
    <div>
      <p>Count: {count}</p>
      <button onClick={() => setCount(count + 1)}>Increment</button>
    </div>
  );
}

export default EmptyDependencyExample;
  • 注意知识:
    • 使用空依赖数组 [] 可以确保 useEffect 仅在组件挂载时执行一次。
    • 清理函数用于执行清理工作,比如取消订阅、清除定时器等。

2. 具体依赖的数组

import React, { useState, useEffect } from 'react';

function DependencyArrayExample({ prop }) {
  const [count, setCount] = useState(0);

  useEffect(() => {
    console.log("Component mounted or prop changed");
    // 每次 prop 或 count 变化时都会触发 useEffect
    return () => {
      console.log("Component unmounted or prop changed");
    };
  }, [prop, count]); // 传入依赖数组表示当其中任一依赖变化时执行

  return (
    <div>
      <p>Count: {count}</p>
      <button onClick={() => setCount(count + 1)}>Increment</button>
    </div>
  );
}

export default DependencyArrayExample;
  • 注意知识:
    • 通过传递一个包含变量的数组作为 useEffect 的依赖,可以监听该变量的变化并执行相应的副作用操作。
    • 当数组中的任一依赖变化时,useEffect 将会重新执行。

3. 没有依赖数组

import React, { useState, useEffect } from 'react';

function NoDependencyExample() {
  const [count, setCount] = useState(0);

  useEffect(() => {
    console.log("Component rendered");
    return () => {
      console.log("Component re-rendered");
    };
  }); // 没有依赖数组表示在每次组件渲染时执行

  return (
    <div>
      <p>Count: {count}</p>
      <button onClick={() => setCount(count + 1)}>Increment</button>
    </div>
  );
}

export default NoDependencyExample;
  • 注意知识:
    • 没有传递依赖数组时,useEffect 在每次组件渲染时都会执行。
    • 当需要在组件渲染时执行某些操作,而不是依赖于特定的变量时,可以使用没有依赖数组的 useEffect

一个函数组件中可以包含多个 useEffect。每个 useEffect 都可以处理不同的副作用,使代码更模块化和可维护。下面是一个示例:

import React, { useState, useEffect } from 'react';

function MultipleEffectsExample() {
  const [count, setCount] = useState(0);
  const [data, setData] = useState(null);

  // 第一个 useEffect 处理 count 的副作用
  useEffect(() => {
    document.title = `Count: ${count}`;

    return () => {
      document.title = 'Original Title';
    };
  }, [count]); // 依赖于 count 的变化

  // 第二个 useEffect 处理 data 的副作用
  useEffect(() => {
    const fetchData = async () => {
      const response = await fetch('https://api.example.com/data');
      const result = await response.json();
      setData(result);
    };

    fetchData();

    return () => {
      // 在组件卸载或者 data 更新时执行清理操作
      // 比如取消请求等
    };
  }, [data]); // 依赖于 data 的变化

  return (
    <div>
      <p>Count: {count}</p>
      <p>Data: {data}</p>
      <button onClick={() => setCount(count + 1)}>Increment</button>
    </div>
  );
}

export default MultipleEffectsExample;
  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 在React中,useEffect是一个用于执行副作用的钩子函数。副作用是指每次组件更新都会执行的函数,可以用来取代生命周期方法。根据不同的使用方式,useEffect可以在组件挂载、更新和卸载时执行不同的逻辑。\[3\] 常见的useEffect使用方式有三种: 1. 每次更新都执行:不传递第二个参数,这会导致每次渲染都会运行useEffect。当它运行时,它获取数据并更新状态。一旦状态更新,组件将重新呈现,这将再次触发useEffect。\[1\] 2. 初始化页面时只执行一次:传递一个空数组作为第二个参数,这样useEffect只会在组件挂载时执行一次。\[2\] 3. 依赖项变化时执行:传递一个包含依赖项的数组作为第二个参数,当依赖项的值发生变化时,useEffect会执行。可以传入多个依赖项,只要有一项有变更就会执行effect。\[2\] 在使用useEffect时,可以根据需要返回一个清除函数,用于清除副作用。例如,设置一个定时器时,需要在组件卸载时关闭定时器,就可以在副作用中返回一个函数来关闭定时器。\[3\] 总结来说,useEffect是一个非常有用的钩子函数,可以用于处理组件的副作用逻辑,取代了传统的生命周期方法。根据不同的使用方式,可以在组件挂载、更新和卸载时执行不同的逻辑。 #### 引用[.reference_title] - *1* [react useEffect详解](https://blog.csdn.net/weixin_45760365/article/details/124386573)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [react中副作用函数(useEffect)详解](https://blog.csdn.net/DDAD9527/article/details/121294563)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [react中的useEffect](https://blog.csdn.net/zsm4623/article/details/127733367)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值