手动实现redux(二)

一个app中store(状态树)是唯一的

我们知道对于一个app, store应该是唯一,集中用reducer管理的,那么当app中有多个页面,每个页面有多个组件时,就应该有多个reducer来管理。
当我某个组件dispatch出去一个action(动作)时,store接收到action,应该交给谁来管理呢?这里我们暂时无法使store根据不同的action来交由相应的reducer处理。

combineReducer

combineReducer函数将多个不同的reducer整合在一起,然后返回一个整合后的reducer, 也就是一个函数;函数内部通过分治的方式处理不同的action;

代码实现

注意combineReducer函数仍然属于reduxde一部分, 所以我们只需要在上一节的代码中添加即可。

let combineReducer = (reducersObj){

// reducerObj是一个由所有所需reducer组成的对象

return (state, action={ type: Symbol() })=>{

// 返回值其实就是一个rootReducer, 所以参数是state, action,

// 注意这个rootReducer其实就是在创建store的时候传入的reducer.

// 上一节中,创建store的时候需要先调用一下reducer(), 以得到state的默认状态值

// 所以这里给action设置了一个默认值, 注意这里使用了Symbol这样会是action.type无法匹配到用户定义任何的actionTypes

        rootReducer会返回一个新的state
        let newState = {};
          // 当我们接收到一个action时,我们无法知道该交由哪个reducer处理, 所以这里我们 需要遍历所有reducer
        for (let key in reducersObj){
          newState[key]  =  reducersObj[key](state[key], action)
          // 这样一个reducer就成为了store状态树中的子树
          // 比如页面中有todo, counter两个组件对应着两个reducer, reducersObj = {todo, counter}
           // store状态树大概长这样: {todo: {list: [], counter: {number : 0}}
        }
        return newState;
    }
}

最后将 combineReducer导出即可

combineReducer使用

一般来说,在一个app项目目录中,我们都会将reducer独立出来,建立一个reducers文件夹,里面就是各个app中所需的reducer, 然后这个文件夹里还有一个index.js文件

  1. 在这个index.js中我们通常会先引入所有的reducer,并且引入combineReducer

    import counter from ‘./counter‘;

    ...

    import todo from ‘./todo‘;

    import { combineReducers } from "./../redux";

     const rootReducer = combineReducers({
         counter,
         todo,
         ....
     });
     export default rootReducer;

  2. 在store.js文件中引入rootReducer

    import { createStore } from "redux";

    import rootReducers from "./reducers/index";

    export default const store = createStore(rootReducers);

原文地址:https://www.cnblogs.com/paopaolee/p/9505114.html

时间: 2024-10-15 00:23:30

手动实现redux(二)的相关文章

二值法方法综述及matlab程序

在某些图像处理当中一个关键步是二值法,二值化一方面能够去除冗余信息,另一方面也会使有效信息丢失.所以有效的二值化算法是后续的处理的基础.比如对于想要最大限度的保留下面图的中文字,以便后续的定位处理. 二值化算法包括全局二值化和局部二值化, 全局二值化具有速度快但效果相对差的特点, 局部二值化算法具有速度慢效果好的特点. 原图 全局阈值              方法一:直接采用im2bw ;手动阈值 方法二:迭代法求阈值 迭代式阈值选取的基本思路是:首先根据图像中物体的灰度分布情况,选取一个近似

Java基础总结(二)

一.开始的唠叨 上篇里相对重要的是面向抽象与面向接口的编程,二者都体现了开闭原则. 本期继续回顾Java中的基础知识. 二.学习笔记 (一)内部类与异常类 1.内部类: 内部类的外嵌类的成员变量在内部中仍然有效,内部类中的方法也可以调用外嵌类中的方法 内部类的类体中不可以声明类变量和类方法.外嵌类的类体中可以用内部类声明对象作为外嵌类的成员. 内部类仅供它的外嵌类使用,其他类不可以用某个类的内部类声明对象. 值得一提的是内部类编译后的格式,代码如下: public class A { class

TypeScript(二)使用Webpack搭建环境

学习任何的开发,我们都需要对应的环境:包括TypeScript的编译环境和开发工具.这个章节里面,我们就来完成它们的搭建,后续就可以愉快的来写TypeScript代码了. 一. 环境搭建1.1. TypeScript环境安装已经配置好的环境,大家可以直接下载:https://github.com/coderwhy/HYLearnTS.git在上一个章节中我们说过,TypeScript最终会被编译成JavaScript代码:Image01TypeScript运行流程那么我们必然需要对应的编译环境:

Spring学习(三)

1,Spring的事务管理机制 Spring事务管理高层抽象主要包括3个接口,Spring的事务主要是由他们共同完成的: l PlatformTransactionManager:事务管理器-主要用于平台相关事务的管理 l TransactionDefinition: 事务定义信息(隔离.传播.超时.只读)-通过配置如何进行事务管理. l TransactionStatus:事务具体运行状态-事务管理过程中,每个时间点事务的状态信息. 2, PlatformTransactionManager事

PHP下的session的生存周期

首先说一下session的创建的开始到结束的过程. 当程序需要为某个客户端的请求创建一个 session 的时候,服务器首先会检查这个客户端是否已经包含了一个 session 标识,这个我们称为 session id(获取方法为 session_id() ),如果已包含一个 session id 则说明此客户端之前已经创建过 session,服务器则按照 session id 把这个 session 中的值检索出来,如果客户端不包含 session id,说明此客户端第一次请求服务器或手动清除过

Android AsyncTask详解

(写在前面:文章是看了慕课上的教程之后写的,感谢http://www.imooc.com/learn/377) 一.AsyncTask基本结构介绍 首先,顾名思义,AsyncTask是异步任务. 为什么要异步任务? 因为只有UI线程,即主线程可以对控件进行更新操作.好处是保证UI稳定性,避免多线程对UI同时操作. 同时要把耗时任务放在非主线程中执行,否则会造成阻塞,抛出无响应异常. AsyncTask是安卓封装好的异步机制.(当然也可以自己写new thread,handler) AsyncTa

Linux 运维自动化之Cobbler全自动安装Centos管理与使用详解

简介: Cobbler 可以用来快速建立 Linux 网络安装环境,它已将 Linux 网络安装的技术门槛,从大专以上文化水平,成功降低到初中以下,连补鞋匠都能学会. 网络安装服务器套件 Cobbler(补鞋匠)从前,我们一直在做装机民工这份很有前途的职业.自打若干年前 Red Hat 推出了 Kickstart,此后我们顿觉身价倍增.不再需要刻了光盘一台一台地安装 Linux,只要搞定 PXE.DHCP.TFTP,还有那满屏眼花缭乱不知所云的 Kickstart 脚本,我们就可以像哈里波特一样

iOS指向函数的指针和block

  一:block基础知识 block基础知识 基本概念:block是用来保存一段代码的:^:是block得标志  好比*:是指针的标志 特点:1:保存一段代码: 2:可以有参数和返回值: 3:可以作为函数的参数传递: 与代码块的区别,代码块里的代码会自动执行,block中代码要手动调用: 二:普通数据类型.指向函数的指针.block的定义的类比 1:基本数据类型: 例如:int a = 10; 格式:数据类型  变量名 = 值: 2:指向函数的指针:可以仿照上边基本数据类型的定义 例如:voi

【Qt学习笔记】9.容器窗口

容器(Container) Qt里提供多种容器窗口: 1.选项卡窗口 QTabWidget 2.堆叠窗口  QStackedWidget 3.工具窗口  QToolBox 一.选项卡窗口 容纳多个子窗口,每个子窗口显示一个标签(选项卡).当标签被点击时,此窗口置于最前. 实现方式: 1.使用Qt Designer 2.手动添加 Widget 二.堆叠窗口 容纳多个Widget,每个Wdiget称为一页 没有标签,由其他窗口控制 通常可以做向导程序 显示第几页: setCurrectIndex()