带你一起手写useReducer

简介: 带你一起手写useReducer

useReducer是基于redux的思想,同时也是useState的替代方案。

原生useReducer的特点

  1. 接收两个参数,第一个参数是reducer函数,第二个参数是一个初始的状态值。
  2. useReducer返回的是一个数组,数组的第一个元素是存储的状态,第二个元素是触发action的方法。

更多更详细的关于useReducer的用法,请看我的这篇博客需要掌握的Hooks之useReducer与useContext

手写useReducer

实现useReducer需要注意的几点:

  1. reducer函数和初始的状态值是用户自定义的。
  2. reducer函数接受两个参数分别是state和action。
  3. useReducer函数接收用户自定以得reducer函数和初始的状态值。
  4. 在useReducer函数中调用到了useState这个钩子函数。

第一步:使用useState获取到用户传递的初始状态值

const [state,setState] = useState(initialState);
复制代码

第二步:通过setState执行用户dispatch过来的action

let dispatch = (action) => {
    setState(reducer(state,action))
}
复制代码

第三步:返回一个数组数组的第一个参数是状态值,第二个状态值是设置这个状态的方法

return [state,dispatch]
复制代码

完整实现

import React,{useState} from 'react'
import ReactDOM from 'react-dom'
/**
 * @description: 手写useReducer 
 * @param {*}
 * @return {*}
 */
function useReducer(reducer,initialState) {
    const [state,setState] = useState(initialState);
    let dispatch = (action) => {
        setState(reducer(state,action))
    }
    return [state,dispatch]
}
function App() {
    const reducer = (state,action) => {
        switch (action.type) {
            case 'increment':
                return state + 1;
            case 'decrement':
                return state - 1;
            default:
                return state;
        }
    }
    const [count,dispatch] = useReducer(reducer,0)
    return (
        <>
            <h1>当前求和为:{count}</h1>
            <button onClick={() => dispatch({type: 'increment'})}>点我+1</button>
            <button onClick={() => dispatch({type: 'decrement'})}>点我-1</button>
        </>
    )
}
ReactDOM.render(<App />, document.querySelector('#root'));
复制代码

在线实现

值得深思的问题

  • 通过实现useReducer我们可以看出这和redux中的reducer的实现思想是一样的,编程思想有时候即使在不同的应用场景中却有着共同的实现思想。
  • 准确理解useReducer的关键是理解useReducer中state的流动过程。
相关文章
|
18天前
|
存储 JavaScript
实现vuex源码,手写
实现vuex源码,手写
|
6月前
|
存储 缓存 JavaScript
手写简单Redux
手写简单Redux
|
前端开发
手写防抖
手写防抖
61 0
|
6月前
|
前端开发 JavaScript UED
手写一个防抖
手写一个防抖
41 0
|
前端开发
react手写全选反选
react手写全选反选
92 0
react手写全选反选
|
缓存 移动开发 前端开发
10分钟教你手写8个常用的自定义hooks
Hook 是 React 16.8 的新增特性。它可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性。本文是一篇以实战为主的文章,主要讲解实际项目中如何使用hooks以及一些最佳实践,不会一步步再介绍一遍react hooks的由来和基本使用,因为写hooks的文章很多,而且官网对于react hooks的介绍也很详细,所以大家不熟悉的可以看一遍官网。
495 0
|
前端开发 算法 安全
前端面试100道手写题(1)—— 手写Promise实现
今年的金三银四面试,遇到了很多新的面试八股文,其实心里对手写题或者算法题有一定抵触,因为实际工作中基本上就不会用到这些东西,但是正因为这些基础八股文,才能真正验证一个人对技术有多热爱的程度。也有可能近几年没有对这些基础知识进行巩固,所以干脆一狠心,先立个flag, 准备完成100道手写题。
256 0
|
前端开发 容器
简单手写实现react的函数组件
简单手写实现react的函数组件
164 0
|
前端开发 JavaScript
简单手写实现React的基本生命周期
简单手写实现React的基本生命周期
133 0
|
前端开发 容器
简单手写实现react的类组件
简单手写实现react的类组件
116 0