当前位置:首页 > 技术分析 > 正文内容

React useEffect的使用场景_react的usememo

ruisui883个月前 (02-20)技术分析15

useEffect 是 React 中最常用的 Hook 之一,它允许你在函数组件中执行副作用操作(side effects)。这些副作用操作包括数据获取、订阅、手动操作 DOM、设置定时器等。useEffect 的设计是为了让你能够在组件渲染后执行这些操作,并且在组件卸载或重新渲染时进行清理。

1.基本用法

useEffect 的基本语法如下:

useEffect(() => {
  // 这里执行操作

  return () => {
    // 这里执行清理操作(可选)
  };
}, [dependencies]);
  • 第一个参数:是一个函数,表示要执行的操作。
  • 第二个参数:是一个数组,表示依赖项(可选)。当依赖项发生变化时,useEffect 会重新执行。

2.使用场景

以下是 useEffect 的几种常见使用场景:

2.1数据获取(Fetching Data)

在组件挂载后,你可以使用 useEffect 来从 API 获取数据。

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

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

  useEffect(() => {
    fetch('https://api.example.com/data')
      .then(response => response.json())
      .then(data => setData(data))
      .catch(error => console.error('Error fetching data:', error));
  }, []); // 空数组表示只在组件挂载时执行

  return (
    
{data ?
{JSON.stringify(data, null, 2)}
: 'Loading...'}
); } export default DataFetching;

2.2订阅事件或监听事件(Subscriptions/Event Listeners)

你可以使用 useEffect 来订阅某个事件(如窗口大小变化、键盘事件等),并在组件卸载时取消订阅。

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

function WindowSize() {
  const [width, setWidth] = useState(window.innerWidth);

  useEffect(() => {
    const handleResize = () => setWidth(window.innerWidth);
    window.addEventListener('resize', handleResize);

    return () => {
      window.removeEventListener('resize', handleResize);
    };
  }, []); // 空数组表示只在组件挂载和卸载时执行

  return 
Window width: {width}px
; } export default WindowSize;

2.3手动操作 DOM(Direct DOM Manipulation)

在某些情况下,你可能需要手动操作 DOM 元素,useEffect 可以帮助你完成这个操作。

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

function FocusInput() {
  const inputRef = useRef(null);

  useEffect(() => {
    inputRef.current.focus();
  }, []); // 空数组表示只在组件挂载时执行

  return ;
}

export default FocusInput;

2.4设置定时器或延时操作(Timers/Intervals)

你可以使用 useEffect 来设置定时器或延时操作,并在组件卸载时清除定时器。

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

function Timer() {
  const [seconds, setSeconds] = useState(0);

  useEffect(() => {
    const interval = setInterval(() => {
      setSeconds(prevSeconds => prevSeconds + 1);
    }, 1000);

    return () => clearInterval(interval);
  }, []); // 空数组表示只在组件挂载和卸载时执行

  return 
Seconds: {seconds}
; } export default Timer;

2.5依赖项变化时执行(Dependency Array)

useEffect 的第二个参数是一个依赖项数组,当依赖项发生变化时,useEffect 会重新执行。

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

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

  useEffect(() => {
    console.log(`Count has changed to: ${count}`);
  }, [count]); // 当 count 变化时执行

  return (
    

Count: {count}

); } export default Counter;

2.6清理操作(Cleanup)

在 useEffect 中,你可以返回一个清理函数,用于在组件卸载或重新渲染时执行清理操作。

import React, { useEffect } from 'react';

function CleanupExample() {
  useEffect(() => {
    console.log('Component mounted');

    return () => {
      console.log('Component unmounted');
    };
  }, []); // 空数组表示只在组件挂载和卸载时执行

  return 
Cleanup Example
; } export default CleanupExample;

3.注意事项

  • 避免无限循环:如果你在 useEffect 中更新状态,并且没有正确设置依赖项,可能会导致无限循环。例如:
useEffect(() => {
  setCount(count + 1);
}, [count]); // 这里会导致无限循环
  • 依赖项数组:如果你省略了依赖项数组(即不传递第二个参数),useEffect 会在每次渲染后执行。这可能会导致性能问题。
useEffect(() => {
  console.log('This will run on every render');
}); // 没有依赖项数组
  • 清理函数:如果你在 useEffect 中设置了订阅、事件监听器或定时器,务必要返回一个清理函数,以避免内存泄漏。

4.总结

useEffect 是一个非常强大的 Hook,它允许你在函数组件中执行各种副作用操作。通过合理使用依赖项数组和清理函数,你可以确保副作用操作只在必要时执行,并且在组件卸载时进行清理。希望这些使用场景和示例能帮助你更好地理解和应用 useEffect。

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/2099.html

标签: 清除定时器
分享给朋友:

“React useEffect的使用场景_react的usememo” 的相关文章

Python 幕后:Python导入import的工作原理

更多互联网精彩资讯、工作效率提升关注【飞鱼在浪屿】(日更新)Python 最容易被误解的方面其中之一是import。Python 导入系统不仅看起来很复杂。因此,即使文档非常好,它也不能让您全面了解正在发生的事情。唯一方法是研究 Python 执行 import 语句时幕后发生的事情。注意:在这篇文...

面试被逼疯:聊聊Python Import System?

面试官一个小时逼疯面试者:聊聊Python Import System?对于每一位Python开发者来说,import这个关键字是再熟悉不过了,无论是我们引用官方库还是三方库,都可以通过import xxx的形式来导入。可能很多人认为这只是Python的一个最基础的常识之一,似乎没有可以扩展的点了,...

双子座应用程序推出模型切换器以在Android上访问2.0

#头条精品计划# 快速导读谷歌推出了Gemini 2.0 Flash实验版,现已在其安卓应用中可用,之前仅在gemini.google.com网站上提供。新版本的15.50包含模型切换器,用户可以在设置中选择不同模型,包括1.5 Pro、1.5 Flash和2.0 Flash实验版。谷歌提醒,2.0...

Vue页面传参详解

一、两种方式方法1:name跳转页面this.$router.push({name:'anotherPage',params:{id:1}})另一页面接收参数方式:this.$route.params.id示例:控制台展示:方法2:path跳转页面this.$router.push(...

关于Vue页面跳转传参,参数不同, 但页面只获取参数一次的问题

#头条创作挑战赛#1.问题描述问题描述: element 展示表格(页面A),点击表格的每一行的查看详情按钮,可以携带此行的信息参数跳转到另一个页面(页面B),但是从A页面到B页面,只有第一次跳转的时候B页面可以获取到A页面的参数,返回再次A->B ,B页面无法获取到参数。2.解决办法:方法一...

从 Vue2.0 到 React17——React 开发入门

作者:佚名来源:前端大全前言找工作时发现有一些公司是以React作为技术栈的,而且薪资待遇都不错,为了增加生存的筹码,所以还是得去学一下React,增加一项求生技能。因为我用Vue2.0开发项目已经四年了,故用Vue2.0开发项目的思路来学习React。前端项目是由一个个页面组成的,对于Vue来说,...