咨询热线:18521199588 联系人:胡海涛 地址:宁波市北仑区长江国际商务大厦B座1105室
react系列(六)Redux Saga
来源:wellbet不给提款 发布时间:2019-11-30 点击量:172
在Redux中常要管理异步操作,目前社区流行的有Redux-Saga、Redux-thunk等。在管理复杂应用时,推荐使用Redux-Saga,它提供了用 generator 书写类同步代码的能力。在讲解 ReduxSaga 前,先要说明一下 Redux Middleware 的概念。
Middleware
它提供的是位于 action 被发起之后,到达 reducer 之前的扩展点。
如果写过 Koa 或者 Express ,就会很容易理解 Middleware 的概念。可以说,Middleware 是一种置于一个调用发起到被处理这段过程之间的函数。它可以对发起的调用进行处理,处理后直接返回,或者调用下一个中间件。在Redux中,使用柯里化函数声明中间件,一个简单的例子如下:
/** * 记录所有被发起的 action 以及产生的新的 state。 */const logger = store => next => action => { console.group(action.type) console.info("dispatching", action) let result = next(action) console.log("next state", store.getState()) console.groupEnd(action.type) return result}
然后需要将它应用到Redux上
import { createStore, combineReducers, applyMiddleware } from "redux"const todoApp = combineReducers(reducers)const store = createStore( todoApp, // applyMiddleware() 告诉 createStore() 如何处理中间件 applyMiddleware(logger, crashReporter))
之后dispatch的每一个action都会触发log中间件。更详细的用法在Redux文档里说明得很详细了,Redux-Middleware。
使用Redux Saga
先定一个小目标,写一个异步增加的demo。先来创建一个sagas.js文件,用来存放我们的sagas。
import { delay } from "redux-saga"import { put, takeEvery } from "redux-saga/effects"export function* plusAsync() { yield delay(1000) yield put({ type: "PLUS" })}// 在dispatch到store并且匹配pattern的每一个action上派生一个sagaexport function* watchPlusAsync() { yield takeEvery("PLUS_ASYNC", incrementAsync)}
在上篇例子的基础上,增加一个按钮,用来派发PLUS_ASYNC
事件。
<button onClick={dispatch({type: "PLUS_ASYNC"}}>{"plusAsync"}</button>
在使用时,经常需要将多个sagas合并成一个。
import { all } from "redux-saga/effects"// ...export default function* rootSaga() { yield all([ watchPlusAsync() ])}
最后,需要创建saga Middleware。并将中间件应用到redux上。
import { createStore, applyMiddleware } from "redux";// ...// 创建一个Storeconst sagaMiddleware = createSagaMiddleware()const store = createStore( counter, applyMiddleware(sagaMiddleware))// 运行sagassagaMiddleware.run(allSagas);
常用API说明
middleware.run(saga, ...args)
动态地运行 saga。只能 用于在 applyMiddleware 阶段 之后 执行 Saga。
takeEvery(pattern, saga, ...args)
在发起(dispatch)到 Store 并且匹配 pattern 的每一个 action 上派生一个 saga。
pattern
用来匹配对应的TYPE,对应到指定的saga
处理函数上。args
就是相当于指定给saga
的参数数组,并且takeEvery
会将action拼到最后一个参数上。
takeLatest(pattern, saga, ...args)
在发起到 Store 并且匹配 pattern 的每一个 action 上派生一个 saga。并自动取消之前所有已经启动但仍在执行中的 saga 任务。
这个函数可以说是takeEvery
的防抖版本。具体例子可以查看这里-redux_saga_example。
put(action)
创建一个 Effect 描述信息,用来命令 middleware 向 Store 发起一个 action。 这个 effect 是非阻塞型的,并且所有向下游抛出的错误(例如在 reducer 中),都不会冒泡回到 saga 当中。
all
创建一个 Effect 描述信息,用来命令 middleware 并行地运行多个 Effect,并等待它们全部完成。这是与标准的 Promise#all 相当对应的 API。
更多API请查看Saga文档。
总结
saga
的用法比较简单,分为4步。
- 创建
saga
并且将使用takeEvery
给每一个符合pattern
的action
都增加一个对应的saga处理函数。使用all
导出编写的saga。创建saga中间件,在使用redux创建store时,应用saga中间件。运行中间件。感谢阅读。
相关产品
-
“乱”,显然是2016年的普遍现象。从美国不断在南海搅局,甚至宣称要与中国对抗,到中东反恐上演“双城记”(真假反恐,美俄以及地区大国的微妙博弈);难民危机日益严重,困扰欧洲;土耳其未遂政变引发耐人寻味的冲击波,恐怖袭击频发,俄罗斯驻土耳其大使遭枪击身亡;西亚北非和欧洲不断发生恐怖袭击事件;巴西总统罗塞夫和韩国总统朴槿惠先后被弹劾……全世界都不安宁。
-
2013年生产部在部门所有员工及各部门的协助下,按时按量按质地完成了公司各项任务,但依然存在一些问题需要我们不断努力、精益求精:
-
此外,台当局陆委会下午表示,陆委会与外事部门警务部门等相关机关保持联系,掌握案件发展,当局也向泰国主张应将相关台籍人员遣返回台,依法审理.
-
而作为受害者一方,朱某的儿子凌某也将沈某与其保险公司一同起诉至法院。凌某起诉要求保险公司支付12万元的交强险赔付,要求沈某支付死亡赔偿金、丧葬费以及精神损害抚慰金等各项费用共计394080.15元。
-
《联合报》刊载台湾学者赵春山的文章说,十九大报告涉台部分总结了过去五年的对台工作经验,指出了未来的对台政策方向,具有承先启后的意义。习近平是从中华民族伟大复兴的战略高度,来前瞻两岸关系的发展。他在报告中强调“六个任何”的警语,代表“一中”和“反独”仍是大陆对台政策的底线思维。换言之,大陆对台政策必须和“两个一百年”目标相向而行,不容许造成违背民族大义的负面结果。
-
“感知是成长最好的老师”,孙俪表示,自从体会到与孩子共同成长的神奇经历后,孙俪也认定,“和孩子一起成长、一起感知是件多么重要的事!”
-
据报道,在澳大利亚的悉尼,布里斯班,墨尔本以及堪培拉等地,有一家专门为宠物开设的豪华连锁酒店Hanrob酒店。针对那些准备出门远行,无法带自己宠物的“铲屎官”,为他们的宠物提供服务。在这里,宠物们有自己的独立套房,套房内设置有豪华大床,玩具,等离子电视,DVD播放机等。
-
吴女士说,没过多久就听见男子在门外和人吵起架来。“出门一看,原来是他和两个送餐员在吵。”吴女士说,男子非得要送餐员将他送到附近的一个火锅店,送餐员不同意,几个人就吵了起来。
热点资讯
- 国产大飞机C919完成首次空中远距离转场飞行2019-11-18
- 韩国进口、LG旗下,菲诗小铺让你沐浴在香水之中2019-11-18
- 人工智能会如何改变我们衡量孩子智力的方式2019-11-20
- 德国零售商数据:AMD11月处理器销量是英特尔的两倍多2019-06-26
- 中国人假日越来越多了“共时化”休假现象突出2019-06-26
- 【茧界·人物】邓文雄Awen:时代变迁·回归原本2019-11-07
- 日媒:松下S1全幅无反或为50万日元,贵过索尼α9/尼康Z72019-11-27
- 삼성화재,KOVO컵남자대회준결승막차2019-11-28