React Hooks 教程之 useEffect&useLayoutEffect

功能介绍

useEffect 用于在函数组件中执行副作用操作,那什么是副作用呢?数据获取,数据订阅,以及手动更改 React 组件中的 DOM 都属于副作用

因为我们渲染出的页面都是静态的,任何在其之后的操作都会对其产生影响,所以称之为副作用,副作用又分为两种:

  1. 无需清除的副作用
    比如发送网络请求,手动变更 DOM,记录日志
  2. 需要清除的副作用
    比如订阅外部数据源,添加 DOM 事件,这时清除工作是必需的,可以防止内存泄露

执行时机

useEffect 是在页面渲染完成后 异步 执行
useLayoutEffect 是在页面渲染时 同步 执行,一般用于读取 DOM 布局并同步触发重渲染,不要在这里面做耗时操作,以避免影响页面渲染
大多数情况下用 useEffect 就够了,官方也是建议尽量用 useEffect,两者参数都一样,因此下面以 useEffect 为例进行讲解

函数定义

function useEffect(effect: EffectCallback, deps?: DependencyList): void;
  • effect 第一个参数传入一个函数,函数类型为type EffectCallback = () => (void | Destructor);
  • deps 第二个参数传入依赖数组,用于控制第一个参数 effect 的执行时机,下面会详细介绍

使用示例

将 App.tsx 替换为以下代码

import React from "react";

const App: React.FC = () => {
    const [state, setState] = React.useState(false);
    const [count, setCount] = React.useState(0);

    React.useEffect(() => {
        console.log("组件创建");
        return () => {
            console.log("组件销毁");
        };
    }, [state]);

    return (
        <>
            <div
                onClick={() => {
                    setCount(count + 1);
                }}
            >
                组件 count:{count}
            </div>
            <div
                onClick={() => {
                    setState(!state);
                }}
            >
                组件 state:{String(state)}
            </div>
        </>
    );
};

export default App;

这里 useEffect 第二个参数传了依赖数组,只有在依赖值变化的时候才会执行第一个参数的函数,可以发现点击“组件 count”不会打印日志,而点击“组件 state”会打印创建和销毁的日志,如下:

传[state]

然后我们把第二个参数从[state]改成[],刷新页面再点击,可以发现这次无论点击哪个,都不会执行函数了,日志只打印了第一次进入页面的组件创建,如下:

传[]

最后我们把第二个参数直接去掉,不传,刷新页面,可以看到这次点击两个都会执行函数,打印创建和销毁的日志,如下:

不传

总结

React.useEffect(() => {
    // 创建时执行
    return () => {
        // 销毁时执行
    };
}, [state]); // 依赖列表

依赖列表有三种情况:

  1. 不传,则每次页面重新渲染都会执行 effect 函数
  2. 传空数组,则只执行一次 effect 函数,在进入和退出页面时
  3. 传非空数组,则在数组内依赖值变化时才会执行 effect 函数

相比 Android 和 iOS 动辄六七个生命周期方法,useEffect 只有创建、销毁、更新(依赖数组不传)三个,其实以前 React 类组件也是有多个生命周期方法的,不过从类组件演化到函数组件,简化了不少,这三个已经能覆盖绝大多数开发场景,个人觉得挺好,减少开发者的心智负担

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值