<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        關于React實踐項目的示例詳解(三)

        來源:懂視網 責編:小采 時間:2020-11-27 20:16:19
        文檔

        關于React實踐項目的示例詳解(三)

        關于React實踐項目的示例詳解(三):React在Github上已經有接近70000的 star 數了,是目前最熱門的前端框架。而我學習React也有一段時間了,現在就開始用 React+Redux 進行實戰!上回說到使用Redux進行狀態管理,這次我們使用Redux-saga 管理 Redux 應用異步操作React 實踐項目
        推薦度:
        導讀關于React實踐項目的示例詳解(三):React在Github上已經有接近70000的 star 數了,是目前最熱門的前端框架。而我學習React也有一段時間了,現在就開始用 React+Redux 進行實戰!上回說到使用Redux進行狀態管理,這次我們使用Redux-saga 管理 Redux 應用異步操作React 實踐項目

        上回說到使用Redux進行狀態管理,這次我們使用Redux-saga 管理 Redux 應用異步操作

        React 實踐項目 (一)

        React 實踐項目 (二)

        React 實踐項目 (三)

        - 首先我們來看看登陸的 Reducer

        export const auth = (state = initialState, action = {}) => {
         switch (action.type) {
         case LOGIN_USER:
         return state.merge({
         'user': action.data,
         'error': null,
         'token': null,
         });
         case LOGIN_USER_SUCCESS:
         return state.merge({
         'token': action.data,
         'error': null
         });
         case LOGIN_USER_FAILURE:
         return state.merge({
         'token': null,
         'error': action.data
         });
         default:
         return state
         }
        };

        Sagas 監聽發起的 action,然后決定基于這個 action 來做什么:是發起一個異步調用(比如一個 Ajax 請求),還是發起其他的 action 到 Store,甚至是調用其他的 Sagas。

        具體到這個登陸功能就是我們在登陸彈窗點擊登陸時會發出一個 LOGIN_USER action,Sagas 監聽到 LOGIN_USER action,發起一個 Ajax 請求到后臺,根據結果決定發起 LOGIN_USER_SUCCESSaction 還是LOGIN_USER_FAILUREaction

        接下來,我們來實現這個流程

      1. 創建 Saga middleware 連接至 Redux store

      2. 在 package.json 中添加 redux-saga 依賴

        "redux-saga": "^0.15.4"

        修改 src/redux/store/store.js

        /**
         * Created by Yuicon on 2017/6/27.
         */
        import {createStore, applyMiddleware } from 'redux';
        import createSagaMiddleware from 'redux-saga'
        import reducer from '../reducer/reducer';
        
        import rootSaga from '../sagas/sagas';
        
        const sagaMiddleware = createSagaMiddleware();
        
        const store = createStore(
         reducer,
         applyMiddleware(sagaMiddleware)
        );
        
        sagaMiddleware.run(rootSaga);
        
        export default store;

        Redux-saga 使用 Generator 函數實現

      3. 監聽 action

      4. 創建 src/redux/sagas/sagas.js

        /**
         * Created by Yuicon on 2017/6/28.
         */
        import { takeLatest } from 'redux-saga/effects';
        import {registerUserAsync, loginUserAsync} from './users';
        import {REGISTER_USER, LOGIN_USER} from '../action/users';
        
        export default function* rootSaga() {
         yield [
         takeLatest(REGISTER_USER, registerUserAsync),
         takeLatest(LOGIN_USER, loginUserAsync)
         ];
        }

        我們可以看到在 rootSaga 中監聽了兩個 action 登陸和注冊 。

        在上面的例子中,takeLatest 只允許執行一個 loginUserAsync 任務。并且這個任務是最后被啟動的那個。 如果之前已經有一個任務在執行,那之前的這個任務會自動被取消。

        如果我們允許多個 loginUserAsync 實例同時啟動。在某個特定時刻,我們可以啟動一個新 loginUserAsync 任務, 盡管之前還有一個或多個 loginUserAsync 尚未結束。我們可以使用 takeEvery 輔助函數。

      5. 發起一個 Ajax 請求

      6. 獲取 Store state 上的數據

      7. selectors.js

        /**
         * Created by Yuicon on 2017/6/28.
         */
        export const getAuth = state => state.auth;
      8. api

      9. api.js

        /**
         * Created by Yuicon on 2017/7/4.
         * 
         */
        
        /**
         * 這是我自己的后臺服務器,用 Java 實現
         * 項目地址:
         * 文檔:http://139.224.135.86:8080/swagger-ui.html#/
         */
        const getURL = (url) => `http://139.224.135.86:8080/${url}`;
        
        export const login = (user) => {
         return fetch(getURL("auth/login"), {
         method: 'POST',
         headers: {
         'Content-Type': 'application/json'
         },
         body: JSON.stringify(user)
         }).then(response => response.json())
         .then(json => {
         return json;
         })
         .catch(ex => console.log('parsing failed', ex));
        };
      10. 創建 src/redux/sagas/users.js

      11. /**
         * Created by Yuicon on 2017/6/30.
         */
        import {select, put, call} from 'redux-saga/effects';
        import {getAuth, getUsers} from './selectors';
        import {loginSuccessAction, loginFailureAction, registerSuccessAction, registerFailureAction} from '../action/users';
        import {login, register} from './api';
        import 'whatwg-fetch';
        
        export function* loginUserAsync() {
         // 獲取Store state 上的數據
         const auth = yield select(getAuth);
         const user = auth.get('user');
         // 發起 ajax 請求
         const json = yield call(login.bind(this, user), 'login');
         if (json.success) {
         localStorage.setItem('token', json.data);
         // 發起 loginSuccessAction
         yield put(loginSuccessAction(json.data));
         } else {
         // 發起 loginFailureAction
         yield put(loginFailureAction(json.error));
         }
        }

        select(selector, ...args) 用于獲取Store state 上的數據
        put(action) 發起一個 action 到 Store
        call(fn, ...args) 調用 fn 函數并以 args 為參數,如果結果是一個 Promise,middleware 會暫停直到這個 Promise 被 resolve,resolve 后 Generator 會繼續執行。 或者直到 Promise 被 reject 了,如果是這種情況,將在 Generator 中拋出一個錯誤。

        Redux-saga 詳細api文檔

      12. 結語

      13. 我在工作時用的是 Redux-Thunk, Redux-Thunk 相對來說更容易實現和維護。但是對于復雜的操作,尤其是面對復雜異步操作時,Redux-saga 更有優勢。到此我們完成了一個 Redux-saga 的入門教程,Redux-saga 還有很多奇妙的地方,

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        關于React實踐項目的示例詳解(三)

        關于React實踐項目的示例詳解(三):React在Github上已經有接近70000的 star 數了,是目前最熱門的前端框架。而我學習React也有一段時間了,現在就開始用 React+Redux 進行實戰!上回說到使用Redux進行狀態管理,這次我們使用Redux-saga 管理 Redux 應用異步操作React 實踐項目
        推薦度:
        標簽: 例子 項目 示例
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 中文字幕在线免费播放| 亚洲欧美日韩中文高清www777| 精品成人一区二区三区免费视频 | 日韩在线视频免费| 国产免费av片在线播放| 亚洲高清毛片一区二区| 免费黄色小视频网站| 亚洲真人无码永久在线观看| 成人免费午夜无码视频| 亚洲一区二区三区写真| 成人午夜性A级毛片免费| 人人狠狠综合久久亚洲| 亚洲A∨精品一区二区三区| 成人午夜免费视频| 亚洲欧洲自拍拍偷午夜色无码| 精品视频在线免费观看| 亚洲日本一区二区| 噼里啪啦免费观看高清动漫4| 亚洲一线产品二线产品| 亚洲 综合 国产 欧洲 丝袜 | 免费毛片a线观看| 亚洲男人的天堂在线播放| 国产1000部成人免费视频| 亚洲午夜成人精品无码色欲| 四虎永久免费网站免费观看| 一级毛片在线完整免费观看| 亚洲va久久久噜噜噜久久| 免费毛片a在线观看67194| 亚洲桃色AV无码| 精品国产麻豆免费网站| 国产av无码专区亚洲av毛片搜 | 男男AV纯肉无码免费播放无码| 亚洲国产精品久久久久秋霞影院| 成人免费午夜无码视频| 一级毛片成人免费看a| 亚洲成人在线网站| 最近中文字幕免费mv视频8| 免费中文字幕视频| 337p日本欧洲亚洲大胆艺术| 成人在线视频免费| 免费a级毛片无码a∨免费软件|