React函数式组件使用生命周期和State

React Function Component use Hook and State

Posted by alovn on May 23, 2021

React中函数组件没有Class组件中的State和componentDitMount、componentDidUpdate等生命周期方法,不过可以通过React Hook实现。

使用State

1
2
3
4
5
6
7
8
9
10
import { useState } from 'react';
function ComponentA () {
    const [count, setCount] = useState(0);
    return (
        <div>
            {count}
            <button onClick={setCount(count + 1)}>add</button>
        </div>
    );
}

useEffect

Effect Hook 可以实现componentDidMount、componentDidUpdate和componentWillUnmount的效果。默认情况下,useEffect会在第一次渲染之后和每次更新之后执行,可以使用第二个可选参数进行控制useEffect的执行时机和次数,。

componentDidUpdate

useEffect 第二个参数如果不写,初始化的时候会执行一次,还会监听所有state和props的变化。

1
2
3
4
5
6
import { useEffect } from 'react';
function ComponentA() {
    useEffect(()=>{
        console.log("每次更新后执行")
    });
}

如果指定了第二个参数就会监听该值的变化。

1
2
3
4
5
6
7
8
9
10
11
12
13
import { useEffect } from 'react';
function ComponentB() {
    const [count, setCount] = useState(0);
    useEffect(()=>{
        console.log("componentDidUpdate: count值变化后执行");
    },[count]);
    return (
        <div>
            {count}
            <button onClick={setCount(count + 1)}>add</button>
        </div>
    );
}

componentDidMount

useEffect 第二个参数传递一个空数组,这个Effect将不会重复执行,这样就可以达到componentDidMount的效果。

1
2
3
4
5
6
import { useEffect } from 'react';
function ComponentC() {
    useEffect(()=>{
        console.log("componentDidMount");
    },[]);
}

componentWillUnmount

useEffect 还可以返回一个函数,这个函数会在组件被卸载时执行,这样就相当于componentWillUnmount的效果。

1
2
3
4
5
6
7
8
import { useEffect } from 'react';
function ComponentC() {
    useEffect(()=>{
        return ()=> {
            console.log("componentWillUnmount");
        }
    },[]);
}