React Hooks

引入

Hooks 是 React 16.8 的新增特性。它可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性。Hooks 在函数组件中提供了多种方式来管理状态和生命周期,让代码更简洁、可读性更强。

useState

useState 是一个 Hook,它可以让函数组件拥有状态。每个函数组件都可以通过 useState 来声明局部状态变量。这个状态变量的值可以在函数组件的多次渲染之间保持一致。

-- -------------------- ---- -------
------ ------ - -------- - ---- --------

-------- --------- -
    ----- ------- --------- - ------------

    ------ -
        -----
            -------- -----------
            ------- ----------- -- -------------- - -----------------
        ------
    --
-

在这个例子中,useState 返回一个数组,第一个元素是状态变量 count,第二个元素是更新状态的函数 setCount

useEffect

useEffect Hook 可以让你执行副作用操作,例如数据获取、订阅或手动更改 DOM。它类似于 class 组件中的 componentDidMount, componentDidUpdatecomponentWillUnmount 方法的组合。

-- -------------------- ---- -------
------ ------ - --------- --------- - ---- --------

-------- ---------------------- -
    ----- ------- --------- - ------------
    ----- ------ -------- - ---------------

    ------------ -- -
        -------------- - ---- ------- -------- -------
        -------------------------------------
            -------------- -- ----------------
            ---------- -- ---------------
    -- --------- -- --- ----- ------------ ------

    ------ -
        -----
            -------- -----------
            ------- ----------- -- -------------- - -----------------
            -------- - ------------ - -------------
        ------
    --
-

在这个例子中,useEffect 第二个参数是一个依赖数组,只有当数组中的值发生变化时,useEffect 中的回调函数才会执行。

useContext

useContext Hook 允许你在函数组件中订阅 React 的 Context。它使得你可以避免在组件树中逐层传递 props。

-- -------------------- ---- -------
------ ------ - -------------- ----------- -------- - ---- --------

----- ------------ - ----------------

-------- ----- -
    ----- ------- --------- - ------------------
    ------ -
        ---------------------- --------------
            -------- --
        ------------------------
    --
-

-------- -------------- -
    ------ -
        -----
            ------------- --
        ------
    --
-

-------- -------------- -
    ----- ----- - -------------------------
    ------ ------- -------- ----------- ----- --- ------ - ------- - -------- ------ ----- --- ------ - ------- - ------- -----------------
-

在这个例子中,useContext Hook 让 ThemedButton 组件可以直接访问到 ThemeContext 提供的主题值,而不需要通过 props 一层层传递。

useReducer

useReducer Hook 用来处理更复杂的状态逻辑,特别是当状态更新依赖于先前状态的时候。它通常用于替代 useState

-- -------------------- ---- -------
------ ------ - ---------- - ---- --------

-------- -------------- ------- -
    ------ ------------- -
        ---- ------------
            ------ - ------ ----------- - - --
        ---- ------------
            ------ - ------ ----------- - - --
        --------
            ----- --- --------
    -
-

-------- --------- -
    ----- ------- --------- - ------------------- - ------ - ---
    ------ -
        --
            ------ -------------
            ------- ----------- -- ---------- ----- ----------- --------------
            ------- ----------- -- ---------- ----- ----------- --------------
        ---
    --
-

在这个例子中,useReducer 用于管理 Counter 组件的状态逻辑。reducer 函数接收当前状态和动作对象作为参数,并返回新的状态。

自定义 Hooks

自定义 Hooks 是一种复用状态逻辑的方式。自定义 Hooks 必须以 use 开头,这可以帮助 React 识别该 Hook。

-- -------------------- ---- -------
------ - --------- --------- - ---- --------

-------- ------------------------- -
    ----- ---------- ------------ - ---------------

    ------------ -- -
        -------- -------------------------- -
            -----------------------------
        -

        ----------------------------------------- --------------------
        ------ -- -- -
            --------------------------------------------- --------------------
        --
    ---

    ------ ---------
-

-------- ------------------- -
    ----- -------- - ---------------------------------

    -- --------- --- ----- -
        ------ ---------
    -
    ------ -------- - ---- - -----
-

在这个例子中,useFriendStatus 是一个自定义 Hook,它订阅了朋友的状态变化,并在组件卸载时取消订阅。这样,我们就可以在任何组件中使用这个逻辑。

总结

Hooks 是 React 16.8 中引入的一个重要特性,它们允许你在函数组件中添加状态和其他 React 特性。通过使用 useState, useEffect, useContext, useReducer 以及自定义 Hooks,你可以写出更加简洁、可维护的代码。Hooks 使你能够在函数组件中处理复杂的逻辑,同时保持代码的清晰和可读性。

纠错
反馈