React-Hooks-useReducer

简介: React-Hooks-useReducer

前言


useReducer 是 React 中的一个 Hooks,用于处理复杂的状态逻辑。它允许您管理本地组件状态,将复杂的状态管理逻辑分解成可维护的部分,类似于 Redux 的 reducer。以下是关于 useReducer 的简介:


useReducer 的工作方式类似于传统的 React 类组件中的 this.setState,但更适用于处理复杂状态和操作。它接受两个参数:reducer 函数和初始状态。


  1. reducer 函数:这是一个纯函数,接受当前状态和一个操作(action),并返回新状态。它用于定义如何根据操作来更新状态。例如,当用户点击按钮时,您可以派发一个操作(action),然后 reducer 函数根据操作来计算新的状态。
  2. 初始状态:这是状态的初始值,通常是一个对象,表示组件的初始状态。

useReducer 返回一个包含当前状态和 dispatch 函数的数组。dispatch 函数用于触发操作,并传递给 reducer 函数。当您调用 dispatch 时,它会引发状态的更新,然后触发组件的重新渲染。


useState 不同,useReducer 更适合处理复杂的状态逻辑,例如表单验证、多步骤操作或需要依赖先前状态的更新。它使状态管理更加可预测和可维护,因为所有状态更新的逻辑都集中在 reducer 函数中。


总之,useReducer 是 React 中的一个强大 Hooks,适用于管理复杂的组件状态和操作。它能够使状态逻辑更清晰、更可控,有助于编写更健壮的组件。




useReducer Hook 概述


  • 从名称来看, 很多人会误以为 useReducer 是用来替代 Redux 的, 但是其实不是
  • useReducer 是 useState 的一种替代方案, 可以让我们很好的复用操作数据的逻辑代码

首先来用一个案例来带出 useReducer 的使用,案例大致内容为,分别定义了不同的组件然后在各个组件当中编写,自增自减的业务如下:

import React, {useState} from 'react';
function Home() {
    const [numState, setNumState] = useState(0);
    function increment() {
        setNumState(numState + 1);
    }
    function decrement() {
        setNumState(numState - 1);
    }
    return (
        <div>
            <p>{numState}</p>
            <button onClick={() => {
                increment()
            }}>增加
            </button>
            <button onClick={() => {
                decrement()
            }}>减少
            </button>
        </div>
    )
}
function About() {
    const [numState, setNumState] = useState(0);
    function increment() {
        setNumState(numState + 1);
    }
    function decrement() {
        setNumState(numState - 1);
    }
    return (
        <div>
            <p>{numState}</p>
            <button onClick={() => {
                increment()
            }}>增加
            </button>
            <button onClick={() => {
                decrement()
            }}>减少
            </button>
        </div>
    )
}
export default function App() {
    return (
        <div>
            <Home/>
            <About/>
        </div>
    )
}


注意点:

  • 不同组件中的 useState 保存的状态是相互独立的, 是相互不影响的

通过对如上示例的观察可以发现,出现了需要重复的业务逻辑代码,那么在我们使用了 useReducer 之后就会发现大大的优化了。

useReducer 接收的参数:


  • 第一个参数: 处理数据的函数
  • 第二个参数: 保存的默认值

useReducer 返回值,会返回一个数组, 这个数组中有两个元素:

  • 第一个元素: 保存的数据
  • 第二个元素: dispatch 函数
import React, {useReducer} from 'react';
function reducer(state, action) {
    switch (action.type) {
        case 'ADD':
            return {...state, num: state.num + 1};
        case 'SUB':
            return {...state, num: state.num - 1};
        default:
            return state;
    }
}
function Home() {
    const [state, dispatch] = useReducer(reducer, {num: 0});
    return (
        <div>
            <p>{state.num}</p>
            <button onClick={() => {
                dispatch({type: 'ADD'})
            }}>增加
            </button>
            <button onClick={() => {
                dispatch({type: 'SUB'})
            }}>减少
            </button>
        </div>
    )
}
function About() {
    const [state, dispatch] = useReducer(reducer, {num: 0});
    return (
        <div>
            <p>{state.num}</p>
            <button onClick={() => {
                dispatch({type: 'ADD'})
            }}>增加
            </button>
            <button onClick={() => {
                dispatch({type: 'SUB'})
            }}>减少
            </button>
        </div>
    )
}
export default function App() {
    return (
        <div>
            <Home/>
            <About/>
        </div>
    )
}




最后

本期结束咱们下次再见👋~

🌊 关注我不迷路,如果本篇文章对你有所帮助,或者你有什么疑问,欢迎在评论区留言,我一般看到都会回复的。大家点赞支持一下哟~ 💗

相关文章
|
Java Maven
启动SpringBoot 错误: 找不到或无法加载主类 com.xx.xxApplication
1、在项目名称上右击–Reload from disk 2、清理项目里面的class文件进行重新编译, 鼠标点击右侧Maven,找到项目名称,然后点击Lifecycle中的clean/compile/install
2436 1
|
5月前
|
人工智能 安全 BI
20万奖金池×最火技术风口!欧莱雅集团首届Agent黑客松火热开启,等你来战
20万奖金池×最火技术风口!欧莱雅集团首届Agent黑客松火热开启,等你来战
118 13
|
5月前
|
人工智能 IDE 开发工具
JetBrains DataSpell 2025.1 发布 - 专业数据科学家的 IDE
JetBrains DataSpell 2025.1 (macOS, Linux, Windows) - 专业数据科学家的 IDE
159 3
|
10月前
|
负载均衡 网络协议 数据库
选择适合自己的数据库多实例负载均衡技术
【10月更文挑战第23天】选择适合自己的数据库多实例负载均衡技术需要全面考虑多种因素。通过深入的分析和评估,结合自身的实际情况,能够做出明智的决策,为数据库系统的高效运行提供有力保障。
226 61
|
10月前
|
监控 数据可视化 Java
深入探索:自制Agent监控API接口耗时
在微服务架构中,监控API接口的调用耗时对于性能优化至关重要。通过监控这些指标,我们可以识别瓶颈,优化系统性能。本文将分享如何自己动手实现一个Agent来统计API接口的调用耗时,提供一种有效的监控解决方案。
241 2
|
9月前
|
JavaScript 前端开发
第三问:与、或、非与其截断原理
本文介绍了逻辑运算符“与”(&&)、“或”(||)和“非”(!)的基本功能及其真值表,并详细解释了它们的截断原理(短路求值)。文章还强调了在使用这些运算符时需要注意的类型转换、短路行为、优先级和可读性问题。
347 0
|
数据采集 监控 安全
网络安全产品之认识入侵检测系统
随着计算机网络技术的快速发展和网络攻击的不断增多,单纯的防火墙策略已经无法满足对安全高度敏感的部门的需要,网络的防卫必须采用一种纵深的、多样的手段。因此,入侵检测系统作为新一代安全保障技术,成为了传统安全防护措施的必要、有效的补充。[《安全防御之入侵检测与防范技术》](http://xiejava.ishareread.com/posts/48309864/)介绍了入侵检测技术,今天让我们从入侵检测系统的工作原理、主要功能、主要类型及与入侵防御系统的关系与区别等方面认识入侵检测系统。
373 2
|
负载均衡 Java 数据库连接
SpringCloud之OpenFeign简单使用
当远程服务调用失败时,会采用熔断降级策略,调用熔断降级的方法返回。
354 2
|
边缘计算 监控 安全
实战要求下,如何做好资产安全信息管理?
“摸清家底,认清风险”做好资产管理是安全运营的第一步。本文一起来看一下资产管理的重要性、难点痛点是什么,如何做好资产管理,认清风险。
663 0