【React Hooks 学习笔记】useReducer

简介: 前端西瓜哥

大家好,我是前端西瓜哥。今天我们继续 React Hooks 的学习,说一下 useReducer。

useReducer 是一种用于维护状态的 Hook,是在 useState 基础上的封装加强。

useReducer 的用法

useReducer 的常用用法是接受一个 reducer 函数,以及一个状态的初始值。状态的初始值会传给 state,reducer 函数则被组装进 dispatch 方法中,控制各种复杂的状态更新。

const [state, dispatch] = useReducer(reducer, { count: 0 });

reducer 函数这个概念来自 Redux,一个状态管理容器库。它接收当前状态值 state 和行为类型 action,来决定返回哪个值作为最新状态。

我们看看下面的例子:

function reducer(state, action) {
  switch (action.type) {
    case 'inc':
      return { count: state.count + 1 };
    case 'dec':
      return { count: state.count - 1 };
    case 'reset':
      return { count: 0 };
    default:
      throw new Error('未能找到匹配类型');
  }
}

可以看到,类型不同,会触发不同的分支逻辑。比如当 action.type 为 'inc'(增加的意思)时,我们会将原本的 state.count 加一,然后返回这个新的 state。这个新的 state 会被 dispatch 拿去更新为最新的状态

下面我们看一个完整的计数器例子,为了表示状态的复杂性,我们用了对象的形式,直接用数字类型其实也可以。

// 注:reducer 在前文的代码块中声明。
function Counter() {
  const [state, dispatch] = useReducer(reducer, { count: 0 });
  return (
    <div>
      <div>count { state.count }</div>
      <button onClick={ () => dispatch({ type: 'inc' }) }>+1</button>
      <button onClick={ () => dispatch({ type: 'dec' }) }>-1</button>
      <button onClick={ () => dispatch({ type: 'reset' }) }>重置</button>
    </div>
  )
}

一个 dispatch 配合上 action.type,我们就能有多种操作状态的方式。

useReducer 还可以通过传入第三个参数——初始化函数 init,来实现惰性初始化。

const [state, dispatch] = useReducer(reducer, 0, val => ({ count: val }));

组件首次渲染时,第二个参数会被传入到初始化函数中执行,然后拿执行完的返回值作为状态的初始值。

useReducer 的优点

useReducer 的优点是:

  1. 通过内聚的方式,解决复杂 state 状态更新逻辑的代码维护问题,比如一些有很多属性的对象。
  2. 传递给子组件也方便些,不用传多个改变状态的函数,传一个 dispatch 就够了。
  3. dispatch 函数在每次渲染仍保持引用不变,可以配合 React.memo() 进行子组件渲染优化。

对于更新状态简单的场景,就没有必要使用 useReducer。

结尾

某种意义上,你可以认为 useReducer 是 useState 应用了 Redux 哲学的魔改版,目的是优雅地进行复杂状态的管理。

相关文章
|
2月前
|
前端开发 JavaScript
React Hooks 全面解析
【10月更文挑战第11天】React Hooks 是 React 16.8 引入的新特性,允许在函数组件中使用状态和其他 React 特性,简化了状态管理和生命周期管理。本文从基础概念入手,详细介绍了 `useState` 和 `useEffect` 的用法,探讨了常见问题和易错点,并提供了代码示例。通过学习本文,你将更好地理解和使用 Hooks,提升开发效率。
73 4
|
2月前
|
前端开发
深入解析React Hooks:构建高效且可维护的前端应用
本文将带你走进React Hooks的世界,探索这一革新特性如何改变我们构建React组件的方式。通过分析Hooks的核心概念、使用方法和最佳实践,文章旨在帮助你充分利用Hooks来提高开发效率,编写更简洁、更可维护的前端代码。我们将通过实际代码示例,深入了解useState、useEffect等常用Hooks的内部工作原理,并探讨如何自定义Hooks以复用逻辑。
|
27天前
|
前端开发 JavaScript
深入探索React Hooks:从useState到useEffect
深入探索React Hooks:从useState到useEffect
|
1月前
|
前端开发 JavaScript 开发者
“揭秘React Hooks的神秘面纱:如何掌握这些改变游戏规则的超能力以打造无敌前端应用”
【10月更文挑战第25天】React Hooks 自 2018 年推出以来,已成为 React 功能组件的重要组成部分。本文全面解析了 React Hooks 的核心概念,包括 `useState` 和 `useEffect` 的使用方法,并提供了最佳实践,如避免过度使用 Hooks、保持 Hooks 调用顺序一致、使用 `useReducer` 管理复杂状态逻辑、自定义 Hooks 封装复用逻辑等,帮助开发者更高效地使用 Hooks,构建健壮且易于维护的 React 应用。
34 2
|
2月前
|
前端开发 开发者
React 提供的其他重要 Hooks
【10月更文挑战第20天】React 提供了一系列强大的 Hooks,除了 `useRef` 之外,还有许多其他重要的 Hooks,它们共同构成了函数式组件开发的基础。
37 6
|
19天前
|
缓存 前端开发 开发者
深入理解React Hooks,打造高效响应式UI
深入理解React Hooks,打造高效响应式UI
28 0
|
2月前
|
前端开发 JavaScript 开发者
React Hooks
10月更文挑战第13天
37 1
|
2月前
|
前端开发
|
1月前
|
前端开发 JavaScript 中间件
React中使用​​useReducer​​​高阶钩子来管理状态
通过本文的介绍,您可以在React中使用 `useReducer`高阶钩子来管理复杂的状态逻辑。`useReducer`不仅提供了清晰的状态管理方式,还可以通过与 `useContext`结合,实现全局状态管理。此外,通过自定义中间件,可以进一步扩展其功能。希望本文对您理解和应用 `useReducer`有所帮助。
36 0
|
2月前
|
前端开发 JavaScript API
自定义React Hooks综合指南
本文介绍了React Hooks及其在组件开发中的作用,重点讲解了自定义Hook的创建和使用方法。通过实例展示了如何创建`useWindowWidth`、`useFetch`和`useForm`等自定义Hook,并分享了使用自定义Hook的最佳实践。文章强调了自定义Hook在提高代码复用性和组件可维护性方面的重要性。
70 0