redux-saga使用

項(xiàng)目地址:
https://github.com/iosKey/redux-saga

概述:
redux-saga是副作用(數(shù)據(jù)獲取、瀏覽器緩存)易于管理、執(zhí)行、測試和失敗處理

安裝路由
yarn add react-router-dom -S
安裝redux-saga
npm install --save redux-saga
yarn add redux-saga -S
安裝react-redux
yarn add react-redux -S
安裝redux-thunk
yarn add redux-thunk -S

store.js saga為中間件的形式接入,配置createStore使用
import { createStore, combineReducers, applyMiddleware } from "redux";
import thunk from "redux-thunk";
import createSagaMiddleware from "redux-saga";
import mySaga from "./MySaga";

const loginInfo = {
  isLogin: false,
  loading: false,
  err: "",
  user: {
    name: ""
  }
};
function loginReducer(state = { ...loginInfo }, action) {
  switch (action.type) {
    case "getUserInfo":
      return { ...loginInfo, loading: true };
    case "loginSuccess":
      return {
        ...state,
        loading: false,
        isLogin: true,
        user: { name: "xiaomi" }
      };
    case "loginFailed":
      return {
        ...state,
        loading: false,
        err: action.err,
        isLogin: false,
        user: { name: "" }
      };
    default:
      return { ...state };
  }
}

const sagaMw = createSagaMiddleware();

const store = createStore(
  combineReducers({
    user: loginReducer
  }),
  // applyMiddleware(thunk)
  applyMiddleware(sagaMw)
);
sagaMw.run(mySaga);

export default store;

MySaga.js 當(dāng)點(diǎn)擊登錄的時候 saga用takeEvery監(jiān)聽action,然后寫對應(yīng)的邏輯函數(shù) put方法實(shí)際就是reducer dispatch更新狀態(tài),call方法做異步處理
//call調(diào)用異步操作 put狀態(tài)更新 takeEvery做saga監(jiān)聽
import { call, put, takeEvery } from "redux-saga/effects";
//說白了saga是用于異步的 用來代替thunk
//模擬登錄接口
const UserService = {
    login(name){
        return new Promise((resolve,reject)=>{
            setTimeout(()=>{
                if(name === '小明'){
                    resolve({name: '小明'});
                }else{
                    reject("用戶名或密碼錯誤")
                }
            },1000);
        });
    }
}

function *loginHandle(action){
    try {
        //先loading起來
       yield put({type: 'getUserInfo'})
        //調(diào)用UserService的login方法 傳參action.name 異步操作
       const res = yield call(UserService.login,action.name); 
       //更新狀態(tài) 做dispatch操作
       yield put({type: 'loginSuccess'})
    } catch (err) {
       yield put({type: 'loginFailed',err})
    }
}

function* mySaga() {
    //拿到action里面的type值 把a(bǔ)ction傳給loginHandle
    yield takeEvery("login", loginHandle);
  }

export default mySaga;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容