最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Redux saga異步管理與生成器詳解

 更新時間:2023年02月06日 09:23:00   作者:碰磕  
這篇文章主要介紹了Redux saga異步管理與生成器,工作中使用了redux-saga這個redux中間件,如果不明白內(nèi)部原理使用起來會讓人摸不著頭腦,閱讀源碼后特意對其原理做下總結(jié)

redux-saga

在學(xué)習(xí)它之前先了解es6生成器

生成器

關(guān)鍵字:yield next()

定義函數(shù)需要在函數(shù)名前急+*

function *test(){
    console.log("11111",'第一次無效無值')
    let input1=yield "111-輸出";
    console.log("2222",input1)
    let input2=yield "2-輸出";
    console.log("1111213",input2)
    let input3=yield "3-輸出";
    console.log("1111213",input3)
}

通過yield進行攔截

然后定義變量接收這個函數(shù)

var pengke_test=test()

再通過next()進行執(zhí)行

可傳參,函數(shù)通過接收變量接收yield的值就是傳來的值

let res1=pengke_test.next('aaa')//執(zhí)行一次就往yield下執(zhí)行一段(第一次傳值是無效的)
console.log(res1);

上方這是執(zhí)行了第一次

再繼續(xù)往下執(zhí)行,直到?jīng)]有了打印的done會為true

用變量接收next() 最后得到的一個對象value(yelid傳來的值)–與—done(是否不能繼續(xù)執(zhí)行)

let res2=pengke_test.next('bbb')//通過變量接收yield的值即傳的bbb值
console.log(res2);
let res3=pengke_test.next('cccc')
console.log(res3);
let res4=pengke_test.next()
console.log(res4);//當(dāng)沒有yield了就打印done為true,value=undefined

上方就是生成器的基本使用了

封裝可執(zhí)行生成器

正常情況下肯定是通過封裝函數(shù)實現(xiàn)調(diào)用請求

function getData1(){
    return new Promise((resolve,reject)=>{
        setTimeout(() => {
            resolve('data1')
        }, 1000);
    })
}
function getData2(){
    return new Promise((resolve,reject)=>{
        setTimeout(() => {
            resolve('data2')
        }, 1000);
    })
}
function getData3(){
    return new Promise((resolve,reject)=>{
        setTimeout(() => {
            resolve('data3')
        }, 1000);
    })
}
function *gen(){
    let f1=yield getData1();
    console.log(f1);
    let f2=yield getData2(f1);
    console.log(f2);
    let f3=yield getData3(f2);
    console.log(f3);
}
function run(fn){
    let g=fn()
    function next(data){
        let result=g.next(data);
        if(result.done){
            return result.value
        }
        result.value.then(res=>{
            next(res)
        })
    }
    next()
}
run(gen)

這樣就學(xué)會了完結(jié)~

redux-saga這里用于異步管理

安裝

npm i redux-saga

基本使用

目錄結(jié)構(gòu)

寫法一

首頁創(chuàng)建一個按鈕進行觸發(fā)

App.js

import React, { Component } from 'react';
import store from './redux/store';
class App extends Component {
    render() {
        return (
            <div>
                <button onClick={()=>{
                    if(store.getState().list1.length===0){
                        //dispatch
                        store.dispatch({
                            type:"get-list"
                        })                        
                    }else{
                        console.log("緩存",store.getState().list1)
                    }
                }}>click-ajax-異步緩存</button>
            </div>
        );
    }
}
export default App;

隨后reducer.js中編寫list1

這里判斷傳來的值如果type=change-list就進行賦值

function reducer(prevState={
    list1:[]
},action={}){
    var newState={...prevState}
    switch(action.type){
        case "change-list":
            newState.list1=action.payload;
            console.log("newState=",newState)
            return newState;
        default:
            return prevState;
    }
}
export default reducer

導(dǎo)出給store.js引用

store.js狀態(tài)編寫

這里使用redux-saga中的createSagaMiddleWare

然后運行了任務(wù)(watchSaga)

import {createStore,applyMiddleware} from 'redux'
import reducer from './reducer'
import createSagaMiddleWare from 'redux-saga'
import watchSaga from './saga';
const SagaMiddleWare=createSagaMiddleWare();//生成
const store= createStore(reducer,applyMiddleware(SagaMiddleWare))//應(yīng)用
SagaMiddleWare.run(watchSaga)//saga任務(wù),
export default store

然后開始創(chuàng)建任務(wù)在saga.js中

  • take:監(jiān)聽組件發(fā)來的action
  • fork:同步執(zhí)行異步處理函數(shù)
  • put:發(fā)出新的action
  • call:發(fā)出異步請求
/**
 * saga任務(wù)
 */
import {take,fork,put,call} from 'redux-saga/effects'
function *watchSaga(){
    while(true){
        //take 監(jiān)聽 組件發(fā)來的action
        yield take("get-list")
        //fork 同步執(zhí)行異步處理函數(shù)
        yield fork(getList)
    }
}
function *getList(){
    //這里做異步處理的
    //call函數(shù)發(fā)異步請求
    let res= yield call(getListAction)//參數(shù)是返回值為promise對象的函數(shù)
   //等待call執(zhí)行完才會執(zhí)行
    yield put({
        type:'change-list',
        payload:res
    })
    //put函數(shù)發(fā)出新的action
}
function getListAction(){
    return new Promise((resolve,reject)=>{
        setTimeout(() => {
            resolve(["123132","碰磕"])
        }, 2000);
    })
}
export default watchSaga

然后導(dǎo)出給store進行使用

這樣一個流程就這樣走完了,從而實現(xiàn)第一次點擊頁面數(shù)據(jù)會執(zhí)行該任務(wù)并且給list1賦值,第二次點擊就可以直接拿到值了.over~

寫法二

將take與fork進行替換

只需要用到takeEvery

//原來:
 function *watchSaga2(){
      while(true){
         //take 監(jiān)聽 組件發(fā)來的action
          yield take("get-list2")
          //fork 同步執(zhí)行異步處理函數(shù)
          yield fork(getList2)
      }
 }
//現(xiàn)在:
 function *watchSaga2(){
    //寫法2
    yield takeEvery("get-list2",getList2)
 }

使用多個saga

使用到redux-saga/effects中的all

import {all} from 'redux-saga/effects'
import watchSaga1 from './saga/saga1';
import watchSaga2 from './saga/saga2';
function *watchSaga(){
    yield all([watchSaga1(),watchSaga2()])
}
export default watchSaga;

將兩個saga引入到該文件最終并且使用all進行執(zhí)行~

到此這篇關(guān)于Redux saga異步管理與生成器詳解的文章就介紹到這了,更多相關(guān)Redux saga異步管理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • React中多語言的配置方式

    React中多語言的配置方式

    這篇文章主要介紹了React中多語言的配置方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • React詳細(xì)講解JSX和組件的使用

    React詳細(xì)講解JSX和組件的使用

    jsx就是javsscript與xml結(jié)合的一種格式,是js語法的一種擴展,只要把html代碼寫在js中就是jsx。react中定義組件有3種寫法:函數(shù)的方式、es5的寫法、es6(類)的寫法
    2022-08-08
  • Remix集成antd和pro-components的過程示例

    Remix集成antd和pro-components的過程示例

    這篇文章主要為大家介紹了Remix集成antd和pro-components的過程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • 學(xué)習(xí)React中ref的兩個demo示例

    學(xué)習(xí)React中ref的兩個demo示例

    這篇文章主要介紹了學(xué)習(xí)React中ref的兩個demo示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-08-08
  • React中常見的動畫實現(xiàn)的幾種方式

    React中常見的動畫實現(xiàn)的幾種方式

    本篇文章主要介紹了React中常見的動畫實現(xiàn)的幾種方式,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01
  • React實現(xiàn)todolist功能

    React實現(xiàn)todolist功能

    這篇文章主要介紹了React實現(xiàn)todolist功能,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • React組件性能提升實現(xiàn)方法詳解

    React組件性能提升實現(xiàn)方法詳解

    這篇文章主要介紹了React組件性能最佳優(yōu)化實踐分享,React組件性能優(yōu)化的核心是減少渲染真實DOM節(jié)點的頻率,減少Virtual?DOM比對的頻率,更多相關(guān)內(nèi)容需要的朋友可以參考一下
    2023-03-03
  • react-native-tab-navigator組件的基本使用示例代碼

    react-native-tab-navigator組件的基本使用示例代碼

    本篇文章主要介紹了react-native-tab-navigator組件的基本使用示例代碼,具有一定的參考價值,有興趣的可以了解一下
    2017-09-09
  • 初識React及React開發(fā)依賴詳解

    初識React及React開發(fā)依賴詳解

    React由Facebook來更新和維護,它是大量優(yōu)秀程序員的思想結(jié)晶,React的流行不僅僅局限于普通開發(fā)工程師對它的認(rèn)可,大量流行的其他框架借鑒React的思想,接下來通過本文介紹React基礎(chǔ)及React開發(fā)依賴介紹,需要的朋友可以參考下
    2022-10-10
  • React中路由參數(shù)如何改變頁面不刷新數(shù)據(jù)的情況

    React中路由參數(shù)如何改變頁面不刷新數(shù)據(jù)的情況

    這篇文章主要介紹了React中路由參數(shù)如何改變頁面不刷新數(shù)據(jù)的情況,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08

最新評論

特克斯县| 玛多县| 沈丘县| 阜新| 兴义市| 天水市| 台东县| 淮南市| 康保县| 张家川| 南岸区| 五原县| 长春市| 库尔勒市| 沙雅县| 兴宁市| 时尚| 金堂县| 石柱| 延安市| 湛江市| 栾川县| 安陆市| 青川县| 比如县| 山东| 和龙市| 大兴区| 南宁市| 叶城县| 涪陵区| 清丰县| 图木舒克市| 股票| 三门峡市| 灌阳县| 修水县| 铁岭县| 建德市| 南汇区| 九江县|