redux questions :

1. reducers 函数如何创建和聚合
2. action创建函数如何如何包裹在dispatch函数中
3. 如何给默认的dispatch方法增加中间件能力

middleware:

(js context)中间件由函数组合的形式创建,实现与主要执行任务正交的功能。
tips:类似的有装饰器模式
在 redux middleware 要装饰的主要功能是 dispatch 函数。dispatch 函数的主要功能是发送actions 给
reducer函数来产生新的state。
applyMiddleware.js
1. 函数组合
    f(x) = 2x 
    g(x) = x^2+3x+1
    (f * g)(x) = f(g(x)) = f(2x) = 4x^2 + 6x + 1
    组合两个或者更多的函数,返回一个新的函数
    function compose(f,g){
        return x=>f(g(x))
    }
    从里向外求值
2. 柯里化(curring)
    通过柯里化,可以创建一个拥有部分信息的新函数
    (bind some information)
    function curring(a){
        return b=>a+b
    }
    通过函数组合和柯里化能够为数据处理创建一个管道
redux midddleware 被设计用来在daispatch调用之前创建组合在一起的函数。
对dispatch的过程做包装,不改变任何值。
 1 export default function applyMiddleware(...middlewares) {
2 return createStore => (...args) => {
3 const store = createStore(...args)
4 let dispatch = () => {
5 throw new Error(
6 'Dispatching while constructing your middleware is not allowed. ' +
7 'Other middleware would not be applied to this dispatch.'
8 )
9 }
10
11 const middlewareAPI = {
12 getState: store.getState,
13 dispatch: (...args) => dispatch(...args)
14 }
15 const chain = middlewares.map(middleware => middleware(middlewareAPI))
16 dispatch = compose(...chain)(store.dispatch)
17 // dispatch is the new
18 return {
19 ...store,
20 dispatch
21 }
22 }
23 }
24
25 //dispatch in createStore
26 // dispatch action and run the listener callBack
27 function dispatch(action) {
28 try {
29 isDispatching = true
30 currentState = currentReducer(currentState, action)
31 } finally {
32 isDispatching = false
33 }
34
35 const listeners = (currentListeners = nextListeners)
36 for (let i = 0; i < listeners.length; i++) {
37 const listener = listeners[i]
38 listener()
39 }
40
41 return action
42 }
43
44
45 // In createStore.js, the enhance is the function returned by applyMiddleware
46 // return a store which dispatch is decorated
47 enhance(createStore)(reducer,preloadState)
48
49 // example looger middleware
50 function logger({getState})=>{
51 return (next)=>(action)=>{
52 // action
53 const returnNext = next(action)
54 const state = getState()
55 console.log(`${ation.type}=>${state}`)
56 // doSomething
57 return returnNext
58 }
59 }

参考:

https://medium.com/@meagle/understanding-87566abcfb7a

理解redux中间件的更多相关文章

  1. 理解 Redux 中间件机制

    Redux 的 action 是一个 JS 对象,它表明了如何对 store 进行修改.但是 Redux 的中间件机制使action creator 不光可以返回 action 对象,也可以返回 ac ...

  2. 3.3 理解 Redux 中间件(转)

    这一小节会讲解 redux 中间件的原理,为下一节讲解 redux 异步 action 做铺垫,主要内容为: Redux 中间件是什么 使用 Redux 中间件 logger 中间件结构分析 appl ...

  3. redux深入理解之中间件(middleware)

    理解reduce函数 reduce() 方法接收一个函数作为累加器(accumulator),数组中的每个值(从左到右)开始缩减,最终为一个值. arr.reduce([callback, initi ...

  4. 理解 Redux 的中间件

    将该思想抽象出来,其实和 Redux 就无关了.问题变成,怎样实现在截获函数的执行,以在其执行前后添加自己的逻辑. 为了演示,我们准备如下的示例代码来模拟 Redux dispatch action ...

  5. 理解Redux以及如何在项目中的使用

    今天我们来聊聊Redux,这篇文章是一个进阶的文章,建议大家先对redux的基础有一定的了解,在这里给大家推荐一下阮一峰老师的文章: http://www.ruanyifeng.com/blog/20 ...

  6. 通俗易懂的理解 Redux(知乎)

    1. React有props和state: props意味着父级分发下来的属性[父组件的state传递给子组件  子组件使用props获取],state意味着组件内部可以自行管理的状态,并且整个Rea ...

  7. Redux:中间件

    redux中间件概念 比较容易理解. 在使用redux时,改变store state的一个固定套路是调用store.dispatch(action)方法,将action送到reducer中. 所谓中间 ...

  8. react+redux教程(七)自定义redux中间件

    今天,我们要讲解的是自定义redux中间件这个知识点.本节内容非常抽象,特别是中间件的定义原理,那多层的函数嵌套和串联,需要极强逻辑思维能力才能完全消化吸收.不过我会多罗嗦几句,所以不用担心. 例子 ...

  9. 轻松理解Redux原理及工作流程

    轻松理解Redux原理及工作流程 Redux由Dan Abramov在2015年创建的科技术语.是受2014年Facebook的Flux架构以及函数式编程语言Elm启发.很快,Redux因其简单易学体 ...

  10. 【React全家桶入门之十三】Redux中间件与异步action

    在上一篇中我们了解到,更新Redux中状态的流程是这种:action -> reducer -> new state. 文中也讲到.action是一个普通的javascript对象.red ...

随机推荐

  1. socket模块实现网络编程及struct模块解决黏包问题

    目录 一.socket模块 1.简介 2.基于文件类型的套接字家族 3.基于网络类型的套接字家族 二.socket代码简介 三.socket代码优化 1.聊天内容自定义 2.让聊天循环起来 3.用户输 ...

  2. CSP-J2022游寄

    本人资料 地区:河北-衡水 洛谷账号:xinao2186182144 洛谷ID:747196 前言 这次比赛本来是信心满满,认为自己这半年来的努力与付出都不会付诸东流(还想表个白?算是吧).到了考场的 ...

  3. rt-thread模糊到清晰系列: thread切换相关

    // 创建thread tid = rt_thread_create("main", main_thread_entry, RT_NULL, RT_MAIN_THREAD_STAC ...

  4. Zstack EPICS Archiver在小课题组的使用经验

    https://www.zstack.io/product/portfolio_comparison/ https://epics-controls.org/resources-and-support ...

  5. 下篇 | 使用 🤗 Transformers 进行概率时间序列预测

    在<使用 Transformers 进行概率时间序列预测>的第一部分里,我们为大家介绍了传统时间序列预测和基于 Transformers 的方法,也一步步准备好了训练所需的数据集并定义了环 ...

  6. leaflet动态加载/手动绘制(圆、多边形)demo

    <script src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3 ...

  7. 6. Texture

    Texture 作用:可以将默认的贴图转换为自己想要的贴图类型. Texture Type: 贴图类型 Default: 默认的 Normal map: 法线贴图 Editor GUI and Leg ...

  8. C#获取各种当前日期时间

    我们可以通过使用DataTime这个类来获取当前的时间.通过调用类中的各种方法我们可以获取不同的时间:如:日期(2008-09-04).时间(12:12:12).日期+时间(2008-09-04 12 ...

  9. K8s集群安全机制

    安全机制说明 k8s作为一个分布式集群管理的工具,保证集群的安全性是其一个重要的任务.API Server是集群内部各个组件通信的中介,也是外部控制的入口,,所以K8s的安全机制就是围绕保护API S ...

  10. 10base-t的数据发送

    功能 数据流(NIC) pin码 发送信号 发送回路 1 2 接收信号 接收回路 3 不使用   4 不使用   5 接收信号 接收回路 6 不使用   7 不使用   8 上图是基于10BASE-T ...