React Hooks - useReducer

2025-06-04

React Hooks - useReducer

我在 YouTube 上有一个视频,里面讲解得更详细。我也在那里更深入地解释了 Reducer 函数。

它是什么?

如果您需要处理更复杂的状态,useReducer 钩子非常适合使用。

如果您熟悉 Redux,它与它非常相似,只是您通常只会将它用于一个或两个组件。

复杂状态

假设您正在获取一些数据,并且想要显示:

  • 获取过程中显示“正在加载...”
  • 一旦获得数据
  • 或错误(如果有)

您需要确保这三者保持同步。获取数据后,您需要确保数据没有加载且没有错误。如果出现错误,则表示数据未加载,也没有数据。

这是 useReducer 的一个很好的用例!

如何使用

我们需要将两个参数传入 useReducer hook。一个是 Reducer,用于管理状态;另一个是初始状态,用于开始工作。

我们的初始状态将是一个包含三个键的对象:加载、数据和错误。

我们的 Reducer 将监听三种不同的 Action 类型,并相应地更新状态。这三种 Action 类型分别是 fetchDataStart、fetchDataSuccess 和 fetchDataFail。

我们将它们放在我们的文件中,但在组件之外:

//App.js
import React, { useReducer } from 'react';

const initialState = {
  loading: false,
  data: null,
  error: null
}

const reducer = (state, action) => {
  switch (action.type) {
    case 'fetchDataStart':
      return {
        ...state,
        loading: true,
        data: null,
        error: null
      }
    case 'fetchDataSuccess':
      return {
        ...state,
        loading: false,
        data: action.data,
        error: null
      }
    case 'fetchDataFail':
      return {
        ...state,
        loading: false,
        data: null,
        error: 'whoops =/'
      }
    default: return state
   }
}

const App = () => {
  return (
    <h1>App Component</h1>
  )
}
Enter fullscreen mode Exit fullscreen mode

注意,我们将它们保存在常量变量下:reducerinitialState。因此,我们将它们传递到 useReducer 钩子中。

const App = () => {
  useReducer(reducer, initialState);
  return (
    <h1>App Component</h1>
  )
}
Enter fullscreen mode Exit fullscreen mode

useReducer 钩子将在一个数组中返回两件事:状态和用于更新状态的动作调度器。

我们将使用数组解构来抓取它们,类似于使用 useState 钩子的 state 和 setState。

const App = () => {
  const [state, dispatch] = useReducer(reducer, initialState);
  return (
    <h1>App Component</h1>
  )
}
Enter fullscreen mode Exit fullscreen mode

调度动作

我们的 useReducer hook 已经全部设置完毕。现在,让我们开始使用它吧!

我们将创建一个用于获取数据的函数,并根据获取请求的状态分派不同的操作。

(我们正在通过 switch 语句和 case 子句在 reducer 中检查这些操作。)

const App = () => {
  const [state, dispatch] = useReducer(reducer, initialState);
  const fetchData = () => {
     dispatch({type: 'fetchDataStart'})
     fetch('ourbackend.com/data')
     .then(res => {
        dispatch({
          type: 'fetchDataSuccess',
          data: res.data
        })
     })
     .catch(error => {
        dispatch({type: 'fetchDataFail'})
     })
   }
   return (
      <h1>App Component</h1>
   )
}
Enter fullscreen mode Exit fullscreen mode

访问状态

访问状态非常简单。 useReducer 在我们解构的数组中返回了 。我们将其保存到常量变量 中state

该状态(我们的初始状态和更新后的状态)是一个对象。因此,我们可以像这样在组件中直接访问这些值:

  return (
     <h1>App Component</h1>
     <p>{state.loading}</p>
     <p>{state.data}</p>
     <p>{state.error}</p>
  )
Enter fullscreen mode Exit fullscreen mode

结论

当不同状态相互依赖时,useReducer 钩子非常有用。

至于引入 Redux,如果整个应用程序的状态很复杂,我通常会这么做。如果只有一两个组件,我会使用 useReducer。

如果您喜欢了解类似的主题,请随时查看我的YouTubeInstagram

希望这对某人有帮助,感谢您的阅读!

-安德鲁

文章来源:https://dev.to/techcheck/react-hooks-usereducer-pnj
PREV
From Zero to DevOps Engineer - DevOps Roadmap for YOUR specific background 🔥 What is DevOps? What is the DevOps skillset? What is YOUR zero or starting point? 🤔 Starting as a Systems Administrator 🧑🏽‍💻 Starting as a Software Developer 👩‍💻 Starting as a Test Automation Engineer👨🏼‍💻 Starting as a Network Engineer🧑🏻‍💻 DevOps Bootcamp considering these different backgrounds 💡 Starting with no or little IT background 🙉 Summary - DevOps Roadmap
NEXT
🚀Hacktoberfest 期间值得贡献的 5 大开源项目 2️⃣0️⃣2️⃣4️⃣