React Hooks 是一种特殊的函数,它可以让你拿到 React 中的很多特性:state生命周期 等等。 在一些 React 的函数组件中,比如:

function Example (props) {
    return <div />;
}

我们可能更习惯叫它 “无状态组件”,因为它没有内部状态(state),也没有生命周期函数。一般如果我们要做一个轻量的组件,只用来渲染数据,不包含自身的 state ,那么我们可以选择函数式组件,它可以给我们带来更好的性能。

一旦我们需要维护组件自身的 state 或是生命周期方法,函数式组件就不能很好的胜任了。我们会选择 class 组件。

我们还是拿最简单的计数器🌰看下:

我们先写一个 class 组件:

class Number extends React.component {
    constructor(props) {
        super(props);
        this.state = {
            count: 0,
        }
        this.handleClick = this.handleClick.bind(this)
    }

    handleClick (e) {
        this.setState({
            count: this.state.count + 1
        })
    }

    render () {
        return (
            <div>
                <p>{this.state.count}</p>
                <button onClick={this.handleClick}>
                    Click me ~
                </button>
            </div>
        )
    }
}

很简单,当我们点一下按钮数字就会加一。

有了 React Hooks 的帮助,我们也可以在函数组件中实现这样的功能。React Hooks 中内置了一个 useState Hook,React 允许我们使用它在函数式组件中使用 state

import React, { useState } from 'react';

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

    return (
        <div>
            <p>{count}</p>
            <button onClick={() => setCount(count + 1)}>
                Click me ~
            </button>
        </div>
    )
}

我们用这样一个函数式组件完成了相同的功能。

我们先从 react 中引入了 useState 这个 Hook,然后使用它初始化这个组件的 stateuseState 接受一个初始值参数,我们使用它初始化 state,然后使用结构赋值拿到 countsetCount,setCount 可以改变 count。当我们想要读取的时候,直接用 count 即可。

如果我们还需要其他 state 的话,直接定义即可:

    const [food, setFood] = useState('🍔')
    const [drink, setDrink] = useState('🍺')
    // ......

所以在之前如果我们编写函数式组件的时候需要使用 state,那么我们会将它转换为 class 组件,现在我们可以在现有的函数式组件中使用 Hook 完成。

React 内置了很多种 Hook 提供不同的功能,我们可以按需选用。除此之外,React 还支持自定义 Hook 。