【周末充电~】来探究一下redux-saga的实现

本文已参加好文召集令活动,点击检查:后端、大前端双赛道投稿,2万元奖池等你应战!

本篇先来跑个首要流程,关于hooks状况处理库的根究还要继源码年代坑人续很长一段时间

接口自动化

早年,由于技能栈的原因我很少运用redu接口查验面试题x。由于初步我以为hooks下不分青红皂白的盲目运用r缓存文件在哪里edux显然是非常不明智了。我一向以为咱们应该把首要精力放到首要的作业上,不应该给项目引进的额外giti的复杂性额外的心智背负。

可是最近手头上的项目根柢全都是基于dva的,这…就让接口类型我很头疼。

我其实是有点轻视dva的,了解dva的朋友应该都知道,它首要便是仰仗redux和red前端开缓存是什么意思发是干什么的ux-saga做了一下数据层的封装(也封了下router和sever)。我初步总前端开发需肄业什么是跟朋友说要是dva都能算得上是一个结构的话。那咱们做的悉数接口类型项目其刚封装接口的界说好基础功用时岂不是都能够算的上一个结构?

可是抱怨归抱怨,假想象不用它,那么咱就有必要拿出一个缓存文件在哪里更好的替代品。所以为了想整一个哪方面都很适宜的状况处理库,我选择先从giteedva下手研究一下。

可是呢redGitux本身没有什么东西,所以那就从saga初步吧~

1. 什么是redux-saga呢

它的官网描缓存视频怎样转入相册绘:redux-saga 是一个用于处理应用程序 Side Effect(副作用,例如异步接口测验获取数据源码本钱,拜访浏览器缓存等)的 library,它的政缓存策是让副作用处理更简略,实施更高效,查验更简略,在处理缺陷时更简略。

额,有点源码太官方了,githubredux-sa前端工程师ga便是一个redux的中间件,接口的界说在作业中最常见的就github中文官网网页是咱们运用它来处理异步action。提起处理异步的中间件比较咱们应该都知道还有一个也前端和后端的差异是和它有着相似的功用。那便是redux-thunk

1.1 redux-thunk

redux-thunk前端学什么这个缓存东西很简略,咱们都清楚。redux所谓的中间件根接口crc过错计数柢上都是围绕着dispatch做文章。由于原缓存视频生的dispatch只能派发一般的action,所以咱们没有办法处理异步。可是假定让dispatch能够接口文档派发一个函数呢?

像这样

dispatc源码是什么意思h((dispatch,getState)=&源码年代坑人gt;{
setTimeout(()=>{
dispatch({type源码年代:源码'xxx'})
},1000)
})

那不就ok了嘛,这便是缓存视频变成本地视频redux-thunk的思路,所以它的源码也非常简略。

可是redux-saga和它不同,redux-saga功源码怎样做成app软件用更加健旺,故运用上也更为繁琐一些

1.2 s缓存视频怎样转入相册aga的简略案例

来看一下运用saga的一个demo

比方咱们结束这么一个小缓存视频怎样转入相册比方

【周末充电~】来根究一下redux-saga的结束

1.3 代码结束

组件中

缓存视频怎样转入本地视频击asy a接口文档dd按钮 disPatch({type:'async_add'})

源码是什么意思码如下

import { useSelector,缓存视频 useDispatch } from 'r前端eact-redux'
co缓存nst App = () => {
const nu源码编辑器mbe接口自动化r = useSelector( (state)=&前端学什么gt;state.n源码年代umber )
cons源码之家t disPatch = useDispatch()
const add =()=>{
disPatch({type:源码怎样做成app软件'add'})
}
const a源码是什么意思syncAdd=()=&gt接口是什么;{
disPatch({type:'async_add'})
}
return (
<div>
{ number }
<button onClick={ add }>add</button>
<button onClick={ asyncAdd }>缓存视频怎样转入相册asy add</buttgithub是干什么的on>
</div>
);
}
export default App;

st前端开发ore中

store中也是老三样github永久回家地址,不同的是redux-saga要跑起来。还需缓存的视频怎样保存到本地求传一个saga到gitgit教程h缓存视频怎样转入相册ub它的run办法里

import {
createStore,
applyMiddleware
} f缓存rom 'redux'
import createSagaMiddleware fr前端学什么om 'redux-saga'
import { rootSaga } from './前端技能sagas'
const reducer = (stat前端e = {
number: 1,github
}, actio源码之家n) => {
switch (action.type) {
case 'add':
return {
...state,
number: state.nu前端结构mber + 1
}
def源码下载ault:
return state
}
}
const sagaMiddleware = createSagaM缓存idd前端工程师leware(前端学什么)
const store = createStore(
reducer,
applyMiddleware(sagaMiddleware)
)
sagaMiddleware.run(rootSaga)
expor源码之家t default stogit指令re

扫盲

在redux-saga中,能够简略把saga划分为三种。即

【周末充电~】来根究一下redux-saga的结束

  • root saga可当作一个saggithub中文官网网页a的主进口,即启用悉数watch saga
  • watch saga担任监听dispatch过来的行为,然后交由worker saga去处理
  • worker saga 究竟处理相应逻辑

即来看saga代码

// Our worker Sa缓存视频在手机哪里找ga: 将实施异步的 increment 任务
export function* incrementAsync()接口卡 {
yield缓存的视频怎样保存到本地 delay(1000)
yield put({ type: 'add' })
}
// Our watcher Saga: 在缓存视频每个 async_add action spawn 一个新的 incrementAsync 任务
export function* watgithub永久回缓存文件在哪里家地址chInc接口的界说rementAsync() {
yield takeEvery('async_add', incrementAsync)
}
// notice how we now onlygithub永久回家地址 export the roo缓存视频怎样转入本地视频tSaga
/接口和抽象类的差异/ single entry pgithub永久回家地址o前端训练组织int to start a缓存视频变成本地视频ll Sagas at ongiti轮胎ce
export  function* rootSaga() {
yield all([
watchIncrementAsync(),
])
}

1.4 作业的根柢流程

【周末充电~】来根究一下redux-saga的结束

2. 中心结束

2.1 几个中心概念

结束之前,先来说几个中心前端训练组织概念

eff前端开发需肄业什么ect api

saga的一些源码交易平台排行effect api(我更喜欢把接口卡他们叫做saga的指令源码之家)首要有下面这些。这些前端训练组织都是一些办法,他们和actionCreate一下,也是回来一个方针

【周末充电~】来根究一下redux-saga的结束

channel

saga中的管道,先简略说一下它首要做的作业。

首要s源码之家aga仰仗了g源码怎样做成app软件enerator。如一个场景咱们想要要派发一个ac接口测验tion来获取接口数据然后更新store中的state。咱们是不是会这样处理

(watch缓存、 worker 写一块了 +-+ )

用t源码年代ake监听这个特前端工程师定的action,然后去拿数据,再然后用put去触发reducer的实施然后更新stor前端训练组织e的state

function* getData() {前端学什么
while (true)前端 {
yielgiti轮胎d take('asyGitnc_add')
const data前端 = yield fetchData()
yiel前端d put({
type: 'updata'
})
}
}

接口的界说黑:channel的作用勒?是不是跑题了?

呃,没有没有。这不就来了。Git这个saga咱们拿过来必定是要实施它。由于生github是干什么的前端开发需肄业什么成器的实施和一般函数不相同,故需求实施一缓存视频变成本地视频下将它变为迭代器,然后写个co去处理。

比方说这时候我源码本钱源码本钱现已拿到这个迭代器it了,咱们必定需求它先往下实施跑到一个yield的当前端开发需肄业什么地。故初步咱们就需求it.n源码之家ext()

这时拿到了第一个yield表达式的回来值,是个take(‘asyn接口类型c_add’)前端开发。tak接口测验e的作用是在匹缓存的视频怎样保存到本地配某个特定的act前端开发ion。这个时机咱们不知接口查验道组件中有没有这个action被触发,所缓存视频怎样转入本地视频以这个迭代器就不能往下实施了。

一同咱们需求调用channel.t接口和抽象类的差异ake将能够让它继前端开发是干什么的续往下实施的函数存下来—也便是next函数 (订源码生意途径排行阅)缓存视频吞并app下载

比及接口测验面试题组件中type为async_add的这个action被派发时 咱们github中文官网网页前端开发需求学什么调用channel.put,实施上面存下来的那个函接口卡数。也便是让这源码下载个迭代器能够继续向下实施(发前端工程师布)

嗯嗯~,不知道这么说,好欠好了解,(真实欠好了解也没关系,继前端续向下看,一会走一遍终前端究的代码就o前端结构k了)。源码是什么意思说白了channel首要便是一个发布订阅。来写一个简略的channel

/**
* 其实便是一个发布订阅
* @returns {ta前端结构ke,put}
*/
const ch前端学什么annel = () => {
let takers = []
/**操控co的实施 */
con源码年代st take = (tGitaker) => {
taker.cancel = () => {
takers = takers.filter(github源码年代坑人是干什么的item => it源码生意网站源码em !=缓存视频= taker);
}
takers.push(taker)
}
/**当页面有action过来 */
const p缓存ut = (action) => {
takers.forEach(taker => {
taker.缓存视频吞并app下载cancel();
taker(action)
})
}
return {
take,
pu前端和后端的差异t
}
}
export default channel

3. 源码

crgithub是干什么的eateSagaMiddleware

redux的中源码生意网站源码间件的格式根柢现已是死的了

这儿仅有的不同便是sagaMiddleware多了一个run办法,一同为了run方缓存的视频怎样保存到本地法能够拿缓存视频兼并到store上的getSta缓存是什么意思tedispat接口查验ch。咱们需求在sagaM前端训练组织iddleware函数里边做点四肢。由于只需这儿可拿到咱们想要的东西。

一同在这儿next函数便是咱们组件派发运用的d前端开发需肄业什么ispatch,故咱们能够在这儿调用 channel.put(action)

即来货了,匆促告知订阅者git指令处理相应逻辑。也即匆促使迭代器往下走

import createChannel from './createChannel';
import runSaga from './runSaga';
const createSagaMiddleware=()=>{
/**创立缓存视频怎样转入本地视频管道 */
let channel = createChannel();
let boundRunSaga;
/**sagaMiddleware */
const缓存视频 sagaMiddleware=({getState,dispatch})=>{
/**意图是想在runSaga源码之家中拿到getState、dispatch等*/
boundRunS缓存的视频怎样保存到本地aga = runSaga.bind(null,{g前端工程师etState,dispatch,channel})
return缓存的视频怎样保存到本地 (next)gitlab=>{
return (action)=>{
next(action)
channel.put(action);
}
}
}
/**sagaMi缓存视频变成本地视频ddlew源码怎样做成app接口文档软件are的run办法 */
sag前端技能aMiddleware.run=(sag源码a)=>boundRunSaga(saga)
return sagaMiddleware
}
exp缓存视频变成本地视频ort default createSagaMiddleware

runSaga

这个runSaga便是究竟的run办法了

这儿首要做源码了什么呢?我这儿写的很简略。可源码生意网站源码以忽略immediately哈,这是我从接口类型源码中copy来的…

你能够了解为传给immediately的函数立即被调用并且retu源码是什么意思rn回来

就像这样returgitin immedi源码交易网站源码ately(cb)giti===retu缓存rn cb()

这儿首要便是想迭代器交给一个co去接口的界说处理,很明显pgitiroc在这儿便是干这个活的

import {
immedgithub是干什么的iately
}前端技能 from './sched缓存视频兼并app下载uler'
import proc from './proc'
/**
* run saga
* @para前端开发需求学什么m {*} param0
* @param {*} saga
*/
const runSaga = (env, saga) => {
let it = typeof saga === 'function' ? saga() : saggitlaba
return immedi接口类型接口测验面试题ately前端技能(() => {
const task = proc(env, it)
rgit指令etu前端工程师rn t接口ask
})源码怎样做成app软件
}
export d缓存视频兼并app下载efault run源码怎样做成app软件Saga

proc

co的逻辑首要便是使用递归了,这儿首要giti便是通过yi前端训练组织led表git指令达式传过来的effect的类型做一下相应的处理

const proc = (egithub永久回家地址缓存视频在手机哪里找nv, it) => {
const {
getState,
dispatch,
ch源码年代坑人anne缓存视频兼并l
} = env
con前端和后端的差异st next =源码生意途径排行 (缓存视频在手机哪里找value, isError) => {
let result缓存的视频怎样保存到本地
result = it.next(value)
let {
value: eff缓存文件在哪里ect,
done
} = result
if (!done) {
switch (effect.type)前端训练组织 {
case 'take':前端开发需求学什么
channel源码下载.take(next)
break;
cgit教程ase 'p前端ut':
d缓存视频变成本地视频ispatch(effect.ac源码之家tionTgiteeype);
next()
break;
de接口查验fault:
if(typeof effect.then==='接口类型f缓存视频兼并unction'){
effect.then(res=>{
if(res){
next(res源码)接口crc过错计数
}else{
next()
}
})
}
break;
}
}else{
return
}
}
n源码ext()
}
export default proc

effect

这个就比较简略了,上面也说了它和agithub是干什么的ctionCrea接口类型te前端和后端的差异差不多。

expor接口crc过错计数t const take = (actionType) => {github中文官网网页
return {
type:前端和后端的差异 'ta接口和抽象类的差异ke',
actionType
};
}
export const put =缓存视频 (actionType) => {
return {
type: '接口和抽象类的差异put',
actionType
};
}

4. 试下作用

来吧根柢的接口文档东西都写好了,现在是骡子是马能够出来溜溜了。把缓存关于s缓存视频变成本地视频aga的东西都换成接口自己的

一个接口央求demo

直接先看作用

【周末充电~】来根究一下redux-saga的结束

我的mock数据

【周末充电~】来根究一下redux-saga的结束

咱们的saga

import {
take,
put
} from '../redux-saga/前端开发需求学什么effec缓存视频怎样转入本地视频t'
co前端工程师nst fetchData = () =&gtgiti; fetch('http://localhost:5001/demo').then(res =&gt接口; res.json()giti轮胎)
function* d源码是什么意思emo() {
while (true) {
yield take('源码交易网站源码口查验缓存视频兼并a缓存视频怎样转入本地视频sync_add')
cogithub是干什么的nst data = yield fetchData()
yield前端开发需肄业什么 put({
type: 'updata'缓存视频怎样转入本地视频,
payload:data.data
})
}
}
export d前端开发efault demo

更改一些store的东西

import {
createStore,
applyMid源码是什么意思dleware
} from 'redux'
import crgiteeeat接口crc过失计数eSagaMiddleware from '../前端学什么redux-saga'
// import { r接口查验面试题ootSaga } from './sagas'
import demo from './my_sa源码是什么意思ga'
const reducer = (state = {
number: 1,
data: ''
}, action) =&接口的界说gt; {
switch (action.type) {
case 'add':
return {
...state,
numgiti轮胎ber: state.number + 1
}
case 'updat缓存文件在哪里a':
return {
...state,
data: action.payload
}
default:
return state
}
}
const sagaMiddleGitware = c前端开发reateSagaMiddleware()
const store = createStore(
reducer,
applyM缓存文件在哪里igithub中文官网网页ddleware(sagaMiddleware)
)
sag前端框架aMi接口查验面试题ddleware.run(d缓存视频怎样转入相册emo)
export default store

组件代码调整

import { useSelector, useDis接口类型patch } from 'react-redux'
const App = () => {
const s前端和后端的差异缓存是什接口文档么意思tate = useSelector( (state)=>{return {number:stat源码本钱e.number,data:stagithubte.data}} )
constgithub disPatch = useDispatch()
c缓存文件在哪里onst add =()=>{
disPatch缓存视频在手机哪里找({ty缓存pe:'add'})
}
const asyncAdd=()=>{
disPatch({type:'async接口是什么_add'})
}
return (
<div>
{ sta缓存文件在哪gitite.number }
{ state.da接口卡ta }
&接口缓存是什么意思自动化lt;button o前端学什么nClick={ add }&g缓存t;add</button>
&l前端git指令面试题t;button onClick={ asyncAdd }>asy add</button&gt前端;
</div&gGitt;
);
}
e接口xport defaugiteelt A源码生意途径排行pp;

5. 写前端到究竟

我这儿的代码有一些当地和源前端缓存视频兼并技能码不太相同,首要是为了接口的界说便前端结构利结束。其关键还是学习思想。

现在仅跑通了一些接口类型简略api,有需求的前端开发是干什么的能够拿去 github:githu缓存视频变成接口的界说本地视频b.c源码om/gong9/saga-…

参看:

zhuanlan.zhihu.com/p/30098155

github.cogithub是干什么的m/redux-saG缓存视频兼并itga/…

redux-前端开发saga-ingitee-chinese.js.org/

发表评论

提供最优质的资源集合

立即查看 了解详情