【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 哲学的魔改版,目的是优雅地进行复杂状态的管理。

相关文章
|
3天前
|
前端开发 JavaScript
React_函数式Hooks和Class比较优缺点
React Hooks与Class组件都能返回JSX并接收props,但Hooks无`this`指向问题,用`useEffect`模拟生命周期,`memo`优化性能,状态更新用`useState`;Class组件通过生命周期方法、`PureComponent`或`shouldComponentUpdate`优化,状态用`this.state`和`this.setState`管理。
13 1
React_函数式Hooks和Class比较优缺点
|
3天前
|
前端开发 JavaScript
React中函数式Hooks之useRef的使用
React中函数式Hooks的useRef用于获取DOM元素的引用,示例代码演示了其基本用法。
16 3
|
3天前
|
前端开发
React中函数式Hooks之useEffect的使用
本文通过示例代码讲解了React中`useEffect` Hook的用法,包括模拟生命周期、监听状态和清理资源。
15 2
React中函数式Hooks之useEffect的使用
|
2天前
|
前端开发 JavaScript API
深入探索React Hooks与状态管理
深入探索React Hooks与状态管理
12 2
|
10天前
|
前端开发 JavaScript 开发者
深入探索React Hooks的魔力
深入探索React Hooks的魔力
38 10
|
3天前
|
缓存 前端开发
React中函数式Hooks之memo、useCallback的使用以及useMemo、useCallback的区别
React中的`memo`是高阶组件,类似于类组件的`PureComponent`,用于避免不必要的渲染。`useCallback` Hook 用于缓存函数,避免在每次渲染时都创建新的函数实例。`memo`可以接收一个比较函数作为第二个参数,以确定是否需要重新渲染组件。`useMemo`用于缓存计算结果,避免重复计算。两者都可以用来优化性能,但适用场景不同:`memo`用于组件,`useMemo`和`useCallback`用于值和函数的缓存。
16 1
|
3天前
|
前端开发
React中函数式Hooks之useState的使用
本文介绍了React中函数式组件的Hooks——`useState`的使用方法。`useState`允许在函数式组件中使用状态,它返回一个数组,其中包含当前状态的值和更新该状态的函数。文章通过示例代码展示了如何声明状态变量和更新状态变量,包括对数值和对象状态的更新。此外,还展示了如何通过点击按钮触发状态更新,实现交互功能。
12 1
|
3天前
|
前端开发
React使用hooks遇到的坑_state中的某几个属性数据变成了空字符
本文讨论了在React使用hooks时遇到的一个问题:state中的某些属性数据变成了空字符。作者通过在修改函数中重新解构赋值来获取最新的state值,解决了因数据更新不及时导致的问题。
12 0
|
3天前
|
缓存 前端开发
React中函数式Hooks之useMemo的使用
React的`useMemo` Hook 用于优化性能,通过记忆返回值避免重复计算。它接收一个函数和一个依赖数组,只有当依赖项改变时,才会重新计算被记忆的值。这可以用于避免在每次渲染时都进行昂贵的计算,或者防止子组件不必要的重新渲染。例如,可以在父组件中使用`useMemo`包裹子组件,以依赖特定的props,从而控制子组件的渲染。
12 0
|
5天前
|
前端开发 JavaScript UED
深入React Hooks与性能优化实践
深入React Hooks与性能优化实践
11 0