React-Hooks之useReducer

简介: React-Hooks之useReducer
1.什么是useReducer Hook?

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

可以从下面一个实例对他进行理解

Demo:两个组件中有两个具有完全相同功能的方法increment&descrement

注意点: 不同组件中的useState保存的状态是相互独立的, 是相互不影响的

import React, {useState, 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() {
    function increment() {
        setNumState(numState + 1);
    }
    function decrement() {
        setNumState(numState - 1);
    }
    const [state, dispatch] = useReducer(reducer, {num: 0});
    return (
        <div>
            <p>{state.num}</p>
            <button onClick={increment()}>增加</button>
            <button onClick={discrement()}>减少</button>
        </div>
    )
}
function About() {
    const [numState, setNumState] = useState(5);
    function increment() {
        setNumState(numState + 1);
    }
    function decrement() {
        setNumState(numState - 1);
    }
    return (
        <div>
            <p>{state.num}</p>
            <button onClick={increment()}>增加</button>
            <button onClick={descrement()}>减少</button>
        </div>
    )
}
function App() {
    return (
        <div>
            <Home/>
            <About/>
        </div>
        )
}
export default App;

通过观察可以发现相同的方法incrementdescrement要分别在2个组件中写,非常冗余

解决方案:useReducer

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

// 第一个参数:处理数据的函数
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;
    }
}

//第二个参数:保存的默认值
  const [state, dispatch] = useReducer(reducer, {num: 0});
  • useReducer返回值:会返回一个数组, 这个数组中有两个元素
  • 第一个元素: 保存的数据
  • 第二个元素: dispatch函数

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

通过返回的state和dispatch派发任务和接受返回值

<p>{state.num}</p>
            <button onClick={()=>{dispatch({type:'ADD'})}}>增加</button>

实例优化代码(使用useReducer)

import React, {useState, useReducer} from 'react';
// 1. 定义reducer函数,和reducer的写法相似
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() {
// 接受返回的参数,第一个参数是修改后的数据值,第二个参数是dispatch函数
    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: 5});
    return (
        <div>
            <p>{state.num}</p>
            <button onClick={()=>{dispatch({type:'ADD'})}}>增加</button>
            <button onClick={()=>{dispatch({type:'SUB'})}}>减少</button>
        </div>
    )
}
function App() {
    return (
        <div>
            <Home/>
            <About/>
        </div>
        )
}
export default App;

方便管理又去除了冗余代码~真好!hooks真的太贴心啦!


目录
相关文章
|
5月前
|
前端开发
react中 useContext 和useReducer的使用
react中 useContext 和useReducer的使用
react中 useContext 和useReducer的使用
|
2月前
|
前端开发 JavaScript 中间件
React中使用​​useReducer​​​高阶钩子来管理状态
通过本文的介绍,您可以在React中使用 `useReducer`高阶钩子来管理复杂的状态逻辑。`useReducer`不仅提供了清晰的状态管理方式,还可以通过与 `useContext`结合,实现全局状态管理。此外,通过自定义中间件,可以进一步扩展其功能。希望本文对您理解和应用 `useReducer`有所帮助。
44 0
|
6月前
|
前端开发 JavaScript 数据格式
react18【系列实用教程】Hooks (useState,useReducer,useRef,useEffect,useContext,useMemo,useCallback,自定义 Hook )
react18【系列实用教程】Hooks (useState,useReducer,useRef,useEffect,useContext,useMemo,useCallback,自定义 Hook )
113 1
|
6月前
react18【系列实用教程】useReducer —— 升级版的 useState (2024最新版)
react18【系列实用教程】useReducer —— 升级版的 useState (2024最新版)
69 0
|
8月前
|
前端开发 JavaScript
React中的状态管理:useState与useReducer的使用与探讨
【4月更文挑战第25天】本文探讨了React中构建动态界面的关键——状态管理,重点关注`useState`和`useReducer` Hook。`useState`适用于简单状态管理,例如计数器,而`useReducer`在处理复杂逻辑和多个状态更新时更具优势,提供更好的组织和可维护性。选择使用哪个取决于状态逻辑复杂度、可维护性和性能需求。合理运用这两个工具能实现高效、可维护的React应用。
|
8月前
|
前端开发 JavaScript
深入理解React中的useReducer:管理复杂状态逻辑的利器
深入理解React中的useReducer:管理复杂状态逻辑的利器
|
8月前
|
前端开发 开发者
useReducer 的奇妙世界:探索 React 状态管理的新境界(上)
useReducer 的奇妙世界:探索 React 状态管理的新境界(上)
useReducer 的奇妙世界:探索 React 状态管理的新境界(上)
|
8月前
|
存储 前端开发 测试技术
useReducer 的奇妙世界:探索 React 状态管理的新境界(下)
useReducer 的奇妙世界:探索 React 状态管理的新境界(下)
|
8月前
|
前端开发
useReducer 的奇妙世界:探索 React 状态管理的新境界(中)
useReducer 的奇妙世界:探索 React 状态管理的新境界(中)
|
存储 前端开发 JavaScript
React useReducer 终极使用教程
useReducer 是在 react V 16.8 推出的钩子函数,从用法层面来说是可以代替useState。相信前期使用过 React 的前端同学,大都会经历从 class 语法向 hooks 用法的转变,react 的 hooks 编程给我们带来了丝滑的函数式编程体验,同时很多前端著名的文章也讲述了 hooks 带来的前端心智的转变,这里就不再着重强调,本文则是聚焦于 useReducer 这个钩子函数的原理和用法,笔者带领大家再一次深入认识 useReducer。
React useReducer 终极使用教程