热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

纯Redux原理分析

前言虽然一直使用redux+react-redux,但是并没有真正去讲redux最基础的部分理解透彻,我觉得理解明白redux会对react-redux有一个透彻的理解。其实,re
前言

虽然一直使用redux+react-redux,但是并没有真正去讲redux最基础的部分理解透彻,我觉得理解明白redux会对react-redux有一个透彻的理解。

其实,redux并不只可以用于react的,其实他可以用于任何地方,其实他的基础原理大概就是发布/订阅模式,此处主要对redux的源码进行一个深入的剖析

redux架构

redux一共有下边几部分构成:

* createStore
* combineReducers
* bindActionCreators
* applyMiddleware
* compose

其中,createStore分为如下几部分

* subscribe 订阅用于刷新页面的回调事件
* dispatch 触发动作
* getState 获取当前状态下的store
* replaceReducer 替换初始化传入的reducer
* Observer 相关,不太理解如何使用,暂时略过

store

其实,最简单的使用如下:

执行这个方法 createStore(reducer) 则会返回暴露上面几个方法的一个对象(赋值给store)

通过store.getState则可以获取当前store,此处注意,官方文档一直再说要在你定义的reducer当中定义一个default,来返回默认值,其实主要是页面需要初始化,在createStore.js可以看出最后他调用了

dispatch({ type: ActionTypes.INIT })

action -> dispatch -> 更新store

当dispatch调用的时候(一般会在事件的回调函数中调用),会去执行reducer(也就是你定义的处理函数),通过你的处理函数,最后会返回一个新的store来供你更新redux缓存的store,从这块可以看出

try {
isDispatching = true
// 通过给reducer回传当前状态和动作状态来更新store
currentState = currentReducer(currentState, action)
} finally {
isDispatching = false
}

render

前面提到的store还有一个方法,subscribe,这个方法会缓存传入的方法,便于dispatch的时候进行回调,从而更新试图。

其实,上面这些就是redux的原理了,具体可以看一下redux官方示例,有一个couter的例子,很容易理解: https://github.com/reactjs/re…

下面说一下其他几个点

compose

简单来说就是从右侧函数的返回值,作为左侧函数的参数
compose(fn, fn2)(...args) 等同于 fn(fn2(...args))

applyMiddleware

这个也是挺常用的一个方法

使用方法:

const store = applyMiddleware(Middle1, Middle2)(createStore)(reducer, initialState, enhancer)

这个方法主要做了一件事情

就是利用中间件来改变程序默认创建store,dispatch对整个过程做的处理,从而达到你自己想要的目的

最著名的一个组件就是redux-thunk,说这个方法前,先说说中间件应该怎么写,官网有这么一段描述

每个 middleware 接受 Store 的 dispatch 和 getState 函数作为命名参数,并返回一个函数。该函数会被传入 被称为 next 的下一个 middleware 的 dispatch 方法,并返回一个接收 action 的新函数,这个函数可以直接调用 next(action),或者在其他需要的时刻调用,甚至根本不去调用它。调用链中最后一个 middleware 会接受真实的 store 的 dispatch 方法作为 next 参数,并借此结束调用链。所以,middleware 的函数签名是 ({ getState, dispatch }) => next => action。

下面看下redux-thunk非常简单,但是他的目的主要是为了再不引入第三方框架可以来操作异步事件,如

store.dispatch((dispatch, setState) => {
setTimeout(() => {
dispatch({
type: 'EXAMPLES',
payoad: '...'
})
}, 5);
})

redux-thunk内部做了这么件事情,就是如果action是函数则执行这个函数,给他传入dispatch, getState及其他参数,如果不是,直接调用next(action),将控制权交到下一个中间件(中间件是从左到右执行顺序,最后控制权交到store.dispatch),其实中间件就是在dispatch触发之前做了一些其他的事情来扩展redux功能

combineReducers

一共做了两件事情,首先将reducer进行检查是否为函数,同时检测reducer默认传入的store是否为undefined同时检测是否影响到redux默认明明空间的action type;然后就是返回一个组合reducer,里边处理下每次有值改变的时候,执行该函数(过程同单个reducer),内部其实就是去循环执行他的子reducer,子reducer根据action来进行store的修改,所以来说每个子reducer只要有处理相同type的函数,都会起到作用

注意:如果你的子reducer都不返回新对象,这个方法中会进行判断,则他也不返回新对象

bindActionCreators

可以将Action Creator(也就是生成action的函数)绑定到当前函数,执行后会生成action,然后需用dispatch(action)

没太看懂使用场景,有了解的欢迎留言,互相交流学习。

总结

我们常用的一般是除了bindActionCreatorscompose之外的方法,那个理解明白了,对于以后出现的问题会有很大帮助,本文只是针对最基础的redux进行解析,之后有机会继续解析react-redux对他的封装


推荐阅读
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 开发笔记:计网局域网:NAT 是如何工作的?
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了计网-局域网:NAT是如何工作的?相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • 单点登录原理及实现方案详解
    本文详细介绍了单点登录的原理及实现方案,其中包括共享Session的方式,以及基于Redis的Session共享方案。同时,还分享了作者在应用环境中所遇到的问题和经验,希望对读者有所帮助。 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • 深度学习中的Vision Transformer (ViT)详解
    本文详细介绍了深度学习中的Vision Transformer (ViT)方法。首先介绍了相关工作和ViT的基本原理,包括图像块嵌入、可学习的嵌入、位置嵌入和Transformer编码器等。接着讨论了ViT的张量维度变化、归纳偏置与混合架构、微调及更高分辨率等方面。最后给出了实验结果和相关代码的链接。本文的研究表明,对于CV任务,直接应用纯Transformer架构于图像块序列是可行的,无需依赖于卷积网络。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 本文介绍了Composer依赖管理的重要性及使用方法。对于现代语言而言,包管理器是标配,而Composer作为PHP的包管理器,解决了PEAR的问题,并且使用简单,方便提交自己的包。文章还提到了使用Composer能够避免各种include的问题,避免命名空间冲突,并且能够方便地安装升级扩展包。 ... [详细]
  • Vagrant虚拟化工具的安装和使用教程
    本文介绍了Vagrant虚拟化工具的安装和使用教程。首先介绍了安装virtualBox和Vagrant的步骤。然后详细说明了Vagrant的安装和使用方法,包括如何检查安装是否成功。最后介绍了下载虚拟机镜像的步骤,以及Vagrant镜像网站的相关信息。 ... [详细]
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
  • 本文介绍了OkHttp3的基本使用和特性,包括支持HTTP/2、连接池、GZIP压缩、缓存等功能。同时还提到了OkHttp3的适用平台和源码阅读计划。文章还介绍了OkHttp3的请求/响应API的设计和使用方式,包括阻塞式的同步请求和带回调的异步请求。 ... [详细]
author-avatar
李树兴2502917897
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有