搭建基本环境
首先我有一个处理逻辑的container
1 | import * as React from "react"; |
然后建一个store文件夹。文件夹下的文件为:
- action-types.ts
- actions.ts
- reducer.ts
- store.ts
action-types
1 | export const GET_MUSIC_LISTS = 'GET_MUSIC_LISTS'; |
actions
1 | import { GET_MUSIC_LISTS } from "./action-types"; |
reducer
1 | import { GET_MUSIC_LISTS, UPDATE_MUSIC_LISTS } from "./action-types"; |
store
1 | import reducer from './reducer'; |
下面我们分别用redux-thunk
和redux-saga
来处理异步操作,看看这两者的使用区别。
redux-thunk
安装
1 | npm install redux-thunk --save |
store
1 | import reducer from "./reducer"; |
actions
1 | import { GET_MUSIC_LISTS, UPDATE_MUSIC_LISTS } from "./action-types"; |
这里是redux-thunk使用的关键地方。我们普通的action是直接返回一个对象,但当我们使用了thunk中间件之后,我们可以直接在action中返回一个函数。thunk中间件会判断我们的action返回的是函数还是一个对象,是函数的话,它便会拦截后做相应的处理。
reducer
1 | import { GET_MUSIC_LISTS, UPDATE_MUSIC_LISTS } from "./action-types"; |
我们理一下这里的逻辑。首先我们点击后派发了getMusicLists这个action,我们在这个action中进行了一些异步的处理,这个异步处理后,我们再dispatch了一个用于更新数据的plain object的action,以此来更新数据。
redux-saga
当我们使用redux-thunk来处理异步数据更新时,会发现我们的action的逻辑会逐渐变得复杂,然而理论上action应该是要尽可能简洁,返回一个plain object。redux-saga便可以处理这种问题。它就相当于把刚才我们写在action里的逻辑提取出来,单独再写一个专门处理这些逻辑的文件。
接下来我们使用redux-saga来重写一遍刚才的逻辑。首先还原到使用redux-thunk之前。
安装
1 | npm install redux-saga --save |
首先action types我们是不用改的。主要的改动是以下
1、actions还原,使其只返回plain object
2、新建saga文件,专门用来处理副作用,也就是处理一些异步请求等操作
3、引用redux-saga这个中间件
actions
1 | import { GET_MUSIC_LISTS } from "./action-types"; |
saga
新建saga文件
1 | import {takeLatest, put, delay} from 'redux-saga/effects' |
store
引用saga中间件,因为我是专门写了一个store文件,因此改这个文件内容
1 | import reducer from "./reducer"; |
整体流程基本完了。可以发现,我们并没有改过musiccontainer里的逻辑,所以redux-thunk转移至redux-saga也不会太难。不过逻辑复杂的情况没有尝试过,不敢说的太绝对。