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真的太贴心啦!
5B57C3E5.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 大纲 😁 函数式编程🏆 什么是纯函数🏆 什么是副作用(Effect)🏆 为什么要使用纯函数 😁 React函数组件...
    这个前端不太冷阅读 4,513评论 0 1
  • 1 关于hook 1.1 为什么使用hook 在react类组件(class)写法中,有setState和生命周期...
    江湖yi山人阅读 5,858评论 0 3
  • 这期开始,将开启系列文章的第二部分——基础知识。接下来,会开始系统介绍 React Hooks API。本文将结合...
    林木木road阅读 4,483评论 0 0
  • class 组件存在的问题 复杂组件变得难以理解: 我们在最初编写一个class组件时,往往逻辑比较简单,并不会非...
    张_何阅读 1,300评论 0 0
  • 使用React Hooks有什么优势? 什么是hookshook 是一些可以让你在函数组件里面钩入react st...
    Lyan_2ab3阅读 2,795评论 0 1