当前位置: 首页 > news >正文

第二章 react redux的学习,多个reducer

redux系列文章目录

第一章 简单学习redux,单个reducer

第三章 redux和react-redux,@reduxjs/toolkit依赖结合使用

第四章 react-redux,@reduxjs/toolkit依赖,学习

第五章 两张图告诉你redux常使用的api有哪些

前言

前面我们学习到的是单reducer的使用;要知道redux是个很强大的状态存储库,可以支持多个reducer的使用。

combineReducers

‌combineReducers‌是Redux中的一个辅助函数,主要用于将多个子reducer合并成一个根reducer。这个函数接收一个对象,对象的键是子reducer的名称,值是子reducer函数。合并后的reducer可以调用各个子reducer,并将它们的结果合并成一个state对象。

代码

准备工作
基于上一章代码写新reducer,新增src/pages/users/index.js文件;新增src/redux/userReducer.js文件

store.js

import { createStore, combineReducers } from 'redux';
import counterReducer from './counterReducer'
import userReducer from './userReducer';

//组合多个reducer,本章核心代码
const rootReducer = combineReducers({
    countNum: counterReducer,
    userList: userReducer
})

let store = createStore(rootReducer);

export default store

userReducer.js


function userReducer(state =[], action) {
    switch (action.type) {
        case 'ADDUSER':
            state.push(action.payload)
            return state;
        case 'DECUSER':
            // state.slice(0, -1)
            return state.slice(0, -1); ;
        default:
            return state;
    }
}   


export default userReducer;

users/index.js

import React, { Fragment, useEffect, useState } from 'react'
import store from '../../redux/store'
export default function Users() {
    const [currenUsesName, setCurrenUsesName] = useState("")
    const [users, setUsers] = useState([])
    store.subscribe(() => {
        const { userList } = store.getState()
        setUsers((olduser)=>{return [...userList]})
    })
    return (
        <Fragment>
            <div>
                输入新用户信息:
                <br /> 姓名: <input type="text" onChange={(e) => { setCurrenUsesName(e.target.value) }} />
                &nbsp;
                <button disabled={String(currenUsesName).trim().length === 0} onClick={() => {
                    store.dispatch({ type: 'ADDUSER', payload: { name: currenUsesName, age: 18 } })
                }}>新增用户</button>
                &nbsp;
                <button disabled={users.length === 0} onClick={() => {
                    store.dispatch({ type: 'DECUSER' })
                }}>减少用户</button>
                <ul>
                    {users?.map((item, index) => {
                        return <li key={index}>姓名:{item.name} &nbsp; age:{item.age}</li>
                    })
                    }
                </ul>
            </div>
        </Fragment>
    )
}

最后,将写好的users/index.js引入couter组件中一起展示。可以得到下图效果

效果

多个reducer的效果

总结

上一章中,是单个reducer,这时候监听的store.getState(),是直接的state值。
本章中,是多个reducer,这时候监听的store.getState(),是object对象。

counterReducer

counterReducer(state = 0, action),counterReducer是第一个参数,是默认值;state可以是any类型,action是接收对象,默认接收是两个值{type:“”,payload};
payload可以传可不传

store.dispatch

dispatch()其也是接收对象,其对象也是{type:“”,payload};payload可以传可不传

http://www.dtcms.com/a/112777.html

相关文章:

  • 什么是DHCP服务,在生活中的应用是什么?
  • 使用QAction编辑器添加QAction到ui里
  • 【数字电路】第一章 数制和码制
  • Kotlin 集合函数:map 和 first 的使用场景
  • 自定义组件触发饿了么表单校验
  • LaTeX、KaTeX、Markdown 的用法
  • 15.2linux设备树下的platform驱动编写(程序)_csdn
  • 与 AI 共舞:解锁自我提升的无限可能
  • 如何通过优化HMI设计大幅提升产品竞争力?
  • 配置网络编辑器
  • 【Rust学习】Rust环境搭建和Rust基础语法
  • Jetpack Compose 自定义组件完全指南
  • python基础-13-处理excel电子表格
  • 叁仟数智指路机器人的智能导航精度如何?
  • 【爬虫案例】采集 Instagram 平台数据几种方式(python脚本可直接运行)
  • 你用的是Bing吗?!
  • 【AI论文】GPT-ImgEval:一个用于诊断GPT4o在图像生成方面的综合基准
  • 论文写作篇#8:双栏的格式里怎么插入横跨两栏的图片和表格
  • Kafka 概念
  • Johnson算法——两阶段流水线调度的最优解法
  • k8s安装cri驱动创建storageclass动态类
  • Deep Reinforcement Learning for Robotics翻译解读2
  • 关于apple ios苹果mdm监管锁的漏洞与修复
  • web forms可视化开发显示的网页是用ExpressionWebEditorFrame控件,是IE内核还是简单的HTML解析?如何让他加载CSS和JS?
  • 如何一天背300到500个单词
  • 赚钱模拟器-百宝库v0.1.1
  • 精品可编辑PPT | 基于湖仓一体构建数据中台架构大数据湖数据仓库一体化中台解决方案
  • ffmpeg音频分析
  • 机器学习(1)—线性回归
  • 【Pandasai】理解SmartDataframe 类:对dataframe添加自然语言处理能力