首页 男生 其他 深入浅出React和Redux

7.2.1 redux-thunk中间件

深入浅出React和Redux 程墨 2579 2021-04-06 02:29

  您可以在百度里搜索“深入浅出React和Redux 艾草文学(www.321553.xyz)”查找最新章节!

  

  7.2.1 redux-thunk中间件

  使用Redux访问服务器,同样要解决的是异步问题。

  Redux的单向数据流是同步操作,驱动Redux流程的是action对象,每一个action对象被派发到Store上之后,同步地被分配给所有的reducer函数,每个reducer都是纯函数,纯函数不产生任何副作用,自然是完成数据操作之后立刻同步返回,reducer返回的结果又被同步地拿去更新Store上的状态数据,更新状态数据的操作会立刻被同步给监听Store状态改变的函数,从而引发作为视图的React组件更新过程。

  这个过程从头到尾,Redux马不停蹄地一路同步执行,根本没有执行异步操作的机会,那应该在哪里插入访问服务器的异步操作呢?

  Redux创立之初就意识到了这种问题,所以提供了thunk这种解决方法,但是thunk并没有作为Redux的一部分一起发布,而是存在一个独立的redux-thunk发布包中,我们需要安装对应的npm包:

  npm install --save redux-thunk

  实际上,redux-thunk的实现极其简单,只有几行代码,将它作为一个独立的npm发布而不是放在Redux框架中,更多的只是为了保持Redux框架的中立性,因为redux-thunk只是Redux中异步操作的解决方法之一,还有很多其他的方法,具体使用哪种方法开发人员可以自行决定,在后面章节会介绍Redux其他支持异步操作的方法。

  读者可能想问thunk这个命名是什么含义,thunk是一个计算机编程的术语,表示辅助调用另一个子程序的子程序,听起来有点绕,不过看看下面的例子就会体会到其中的含义。

  假如有一个JavaScript函数f如下定义:

  const f = (x) => {

  return x() + 5;

  }

  f把输入参数x当做一个子程序来执行,结果加上5就是f的执行结果,那么我们试着调用一次f:

  const g = () => {

  return 3 + 4;

  }

  f(g); //结果是 (3+4)*5 = 37

  上面代码中函数g就是一个thunk,这样使用看起来有点奇怪,但有个好处就是g的执行只有在f实际执行时才执行,可以起到延迟执行的作用,我们继续看redux-thunk的用法来理解其意义。

  按照redux-thunk的想法,在Redux的单向数据流中,在action对象被reducer函数处理之前,是插入异步功能的时机。

  在Redux架构下,一个action对象在通过store.dispatch派发,在调用reducer函数之前,会先经过一个中间件的环节,这就是产生异步操作的机会,实际上redux-thunk提供的就是一个Redux中间件,我们需要在创建Store时用上这个中间件。如图7-2所示。

  图7-2 Redux的action处理流程

  在第4章,我们已经接触过了中间件,redux-immutable-state-invariant这个中间件帮助开发者发现reducer里不应该出现的错误,现在我们要再加一个redux-thunk中间件来支持异步action对象。

  我们创建的Store.js文件基本和Todo应用中基本一致,区别就是引入了redux-thunk,代码如下:

  import thunkMiddleware from 'redux-thunk';

  const middlewares = [thunkMiddleware];

  之前我们用一个名为middlewares的数组来存储所有中间件,现在只要往这个数组里加一个元素就可以了,之后,如果需要用到更多的中间件,只需要导入中间件放在middlewares数组中就可以。 深入浅出React和Redux

目录
设置
手机
书架
书页
评论