React 函数组件的立即执行函数中的特定函数
在 React 中,函数组件是一种声明性的、无状态的组件形式,它以纯函数的方式接收输入并返回输出。为了更好地管理状态和副作用,React 引入了 Hooks,其中包括一些特定函数。本文将详细解释 React 函数组件中立即执行函数(IIFE)中的特定函数,包括函数的定义、用途和工作方式等。
1. 立即执行函数(IIFE)
立即执行函数是一种在定义后立即调用的 JavaScript 函数。它通常使用匿名函数表达式来创建,并且可以传递参数和返回值。React 函数组件中使用立即执行函数主要是为了处理副作用。
在 React 中,副作用指那些不直接与渲染结果相关的操作,例如数据获取、订阅事件、手动修改 DOM 等。使用立即执行函数可以确保副作用只会在组件挂载、更新或卸载时被执行,并能够正确处理依赖和清理工作。
2. useEffect
useEffect 是 React 提供的一个 Hook 函数,用于处理副作用。它在每次渲染后都会被调用,并且可以根据传入的依赖数组来控制是否重新调用。
2.1 函数定义
import { useEffect } from 'react';
function useEffect(effect: React.EffectCallback, deps?: React.DependencyList): void;
useEffect 接收两个参数:effectdeps
effect 是一个回调函数,表示要执行的副作用操作。它可以返回一个清理函数,用于在组件卸载时清理副作用。
deps 是一个依赖数组,用于控制何时重新调用 effect。如果传入空数组,则表示只在组件挂载和卸载时调用一次;如果传入非空数组,则会对数组中的每个元素进行深比较,只有当某个依赖发生变化时才会重新调用 effect
2.2 用途
数据获取和订阅:可以在 useEffect 中发送网络请求、订阅事件等。当组件挂载或依赖发生变化时,可以重新调用 effect 来更新数据或重新订阅。
手动修改 DOM:可以在 useEffect 中直接操作 DOM,例如添加或删除元素。由于这是副作用操作,所以需要在返回的清理函数中进行相应的清理工作。
启动定时器和清理定时器:可以使用 useEffect 来启动定时器,并在组件卸载时清理定时器,以避免内存泄漏。
2.3 工作方式
当组件渲染后(包括初始渲染和更新渲染),React 会依次执行所有的 useEffect。具体的工作方式如下:
1.首次渲染时,React 会记录当前的 effect 回调函数,并将其加入到副作用队列中。
2.渲染完成后,React 会依次调用副作用队列中的每个 effect
3.如果 deps 为空数组,则只在首次渲染时调用一次 effect
4.如果 deps 不为空数组,则会对数组中的每个依赖进行深比较。如果任何一个依赖发生变化,则重新调用 effect
5.在下一次渲染之前,React 会先清理上一次渲染产生的副作用。
3. useCallback
useCallback 是 React 提供的一个 Hook 函数,用于缓存回调函数。它可以避免不必要的函数创建和传递。
3.1 函数定义
import { useCallback } from 'react';
function useCallback<T extends (...args: any[]) => any>(
  callback: T,
  deps: React.DependencyList
)
: T;
useCallback 接收两个参数:callbackdeps
reacthooks理解callback 是一个回调函数,可以是内联定义或外部引入的函数。
deps 是一个依赖数组,用于控制何时重新创建回调函数。当数组中的依赖发生变化时,会重新创建回调函数;否则,会返回缓存的回调函数。
3.2 用途
优化性能:避免不必要的函数创建和传递,尤其是当回调函数作为 prop 传递给子组件时,可以使用 useCallback 来确保子组件不会因为父组件的重新渲染而重新创建回调函数。
避免子组件重复渲染:当使用 useCallback 缓存回调函数后,可以将该回调函数作为 prop 传递给子组件。由于子组件接收到的是缓存的回调函数,所以在父组件重新渲染时,子组件不会因为 prop 发生变化而重复渲染。
3.3 工作方式
6.首次渲染时,React 会记录当前的 callbackdeps
7.渲染完成后,React 会检查上一次渲染产生的 callbackdeps 是否与当前值相同。
8.如果相同,则直接返回上一次渲染产生的缓存结果;否则,重新创建回调函数,并将其作为缓存结果返回。
4. useMemo
useMemo 是 React 提供的一个 Hook 函数,用于缓存计算结果。它可以避免不必要的重复计算。
4.1 函数定义
import { useMemo } from 'react';
function useMemo<T>(factory: () => T, deps: React.DependencyList): T;
useMemo 接收两个参数:factorydeps
factory 是一个工厂函数,用于计算结果。
deps 是一个依赖数组,用于控制何时重新计算结果。当数组中的依赖发生变化时,会重新计算结果;否则,会返回缓存的计算结果。
4.2 用途
优化性能:避免不必要的重复计算,尤其是当计算量较大或计算耗时较长时,可以使用 useMemo 来缓存计算结果。
避免子组件重复渲染:当使用 useMemo 缓存计算结果后,可以将该结果作为 prop 传递给子组件。由于子组件接收到的是缓存的计算结果,所以在父组件重新渲染时,子组件不会因为 prop 发生变化而重复渲染。
4.3 工作方式
9.首次渲染时,React 会记录当前的 factorydeps
10.渲染完成后,React 会检查上一次渲染产生的 deps 是否与当前值相同。
11.如果相同,则直接返回上一次渲染产生的缓存结果;否则,重新计算结果,并将其作为缓存结果返回。
5. 总结
React 函数组件的立即执行函数中的特定函数包括 useEffectuseCallbackuseMemo。它们分别用于处理副作用、缓存回调函数和缓存计算结果。这些函数可以帮助我们更好地管理状态和副作用,提高代码的可读性和性能。在使用这些函数时,我们需要注意传入的依赖数组,以确保副作用和计算结果能够正确地更新和缓存。通过合理使用这些特定函数,我们可以编写出更高效、可维护和可扩展的 React 组件。