后端的React之路(十一)

76 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第17天,点击查看活动详情

前言

今天来学React中Hook特性最重要的函数之一:useEffect(),它可以看作类组件中生命周期钩子函数的一个集合,即componentDidMountcomponentDidUpdatecomponentWillUnmount 这三个函数。

useEffect

  useEffect(() => {
    console.log("Hello,Effect")
  });

上面的useEffect例子会在dom元素被更新的时候调用,当useEffect被调用时能都读取到最新的state值,这是React所保证的,以便我们在某些情况下能够解决setState异步设置所带来的问题。

返回副作用

useEffect还提供了一个清除副作用的返回值可选项,以便我们可以在组件被卸载或者state发生改变时自定义清除函数,例如下面的例子:

import React, {useEffect, useState} from 'react';
import ReactDOM from 'react-dom/client';
​
function Demo() {
    const [flag, setFlag] = useState( false );
​
    useEffect( () => {
        console.log( "开始执行" );
        return () => {
            console.log( "清除函数" );
        }
    })
​
    return (
            <div onClick={()=>{setFlag(true)}}>
                DEMO
            </div>
    );
}
​
let root = ReactDOM.createRoot(
        document.getElementById( "root" )
);
root.render( <Demo/> )

当我们点击时,flag的值发生了改变,组件开始重新加载,返回函数就会被执行。

第二个参数deps

那如果我们只想useEffect只执行一次或者只有某个state改变才执行可以吗?答案也是可以滴,useEffect方法提供了第二个参数deps,来判断是否需要让方法执行,我们直接看下面的例子代码:

    useEffect(()=>{
        console.log( "只执行一次" );
    },[]) // 当我们传入[]时,这就告诉 React该useEffect不依赖于组件中的任何值,因此它永远都不需要重复执行。
    
    useEffect(()=>{
        console.log( "当flag改变时才会执行useEffect" );
    },flag) // 当我们传入flag时,这就告诉 React该useEffect依赖于flag这个state,因此当flag发生改变时就会执行方法。

重复定义

useEffect支持通过重复定义来进行逻辑代码的分离,同时保证根据函数的声明顺序来依次进行调用,例如下面的代码:

    useEffect( () => {
        console.log( "开始执行1" );
    } )
​
    useEffect( () => {
        console.log( "开始执行2" );
    } )
​
    useEffect( () => {
        console.log( "开始执行3" );
    } )
    // 开始执行1
    // 开始执行2
    // 开始执行3

执行后控制台就会根据方法声明顺序来进行对应输出

学习资料