目錄
上回說到使用Redux進行狀態管理,這次我們使用Redux-saga 管理Redux 應用非同步操作
- 首先我們來看看登陸的Reducer
首頁 web前端 js教程 關於React 實作專案的範例詳解 (三)

關於React 實作專案的範例詳解 (三)

Jul 24, 2017 pm 03:58 PM
react 實踐 專案

React在Github上已經有接近70000的 star 數了,是目前最熱門的前端框架。而我學習React也有一段時間了,現在就開始用 React+Redux 來實戰吧!

上回說到使用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

##接下來,我們來實作這個流程

  • 建立Saga middleware 連接至Redux store

在package.json 中加入 

redux-saga 依賴

##"redux-saga": "^ 0.15.4"

修改 

src/redux/store/store.js

<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>/** * Created by Yuicon on 2017/6/27. */ import {createStore, applyMiddleware } from &amp;#39;redux&amp;#39;; import createSagaMiddleware from &amp;#39;redux-saga&amp;#39; import reducer from &amp;#39;../reducer/reducer&amp;#39;; import rootSaga from &amp;#39;../sagas/sagas&amp;#39;; const sagaMiddleware = createSagaMiddleware(); const store = createStore( reducer, applyMiddleware(sagaMiddleware) ); sagaMiddleware.run(rootSaga); export default store;</pre><div class="contentsignin">登入後複製</div></div>Redux-saga 使用 Generator 函數實作

    #監聽action
  • 建立src/redux/sagas/sagas.js
/**
 * Created by Yuicon on 2017/6/28.
 */
import { takeLatest } from &#39;redux-saga/effects&#39;;
import {registerUserAsync, loginUserAsync} from &#39;./users&#39;;
import {REGISTER_USER, LOGIN_USER} from &#39;../action/users&#39;;

export default function* rootSaga() {
  yield [
    takeLatest(REGISTER_USER, registerUserAsync),
    takeLatest(LOGIN_USER, loginUserAsync)
  ];
}
登入後複製

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

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

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

    發起一個Ajax 請求
  • # 取得Store state 上的資料
  • ##selectors.js
  • /**
     * Created by Yuicon on 2017/6/28.
     */
    export const getAuth = state => state.auth;
    登入後複製

api
  • 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: &#39;POST&#39;,
        headers: {
          &#39;Content-Type&#39;: &#39;application/json&#39;
        },
        body: JSON.stringify(user)
      }).then(response => response.json())
        .then(json => {
          return json;
        })
        .catch(ex => console.log(&#39;parsing failed&#39;, ex));
    };
    登入後複製

建立src/redux/sagas/users. js
  • /**
     * Created by Yuicon on 2017/6/30.
     */
    import {select, put, call} from &#39;redux-saga/effects&#39;;
    import {getAuth, getUsers} from &#39;./selectors&#39;;
    import {loginSuccessAction, loginFailureAction, registerSuccessAction, registerFailureAction} from &#39;../action/users&#39;;
    import {login, register} from &#39;./api&#39;;
    import &#39;whatwg-fetch&#39;;
    
    export function* loginUserAsync() {
      // 获取Store state 上的数据
      const auth = yield select(getAuth);
      const user = auth.get(&#39;user&#39;);
      // 发起 ajax 请求
      const json = yield call(login.bind(this, user), &#39;login&#39;);
      if (json.success) {
        localStorage.setItem(&#39;token&#39;, 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文檔

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

    以上是關於React 實作專案的範例詳解 (三)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

AI攻克費馬大定理?數學家放棄5年職業生涯,將100頁證明變代碼 AI攻克費馬大定理?數學家放棄5年職業生涯,將100頁證明變代碼 Apr 09, 2024 pm 03:20 PM

費馬大定理,即將被AI攻克?而整件事最有意義的地方在於,AI即將解決的費馬大定理,正是為了證明AI無用。曾經,數學屬於純粹的人類智力王國;如今,這片疆土正被先進的演算法所破解,所踐踏。圖片費馬大定理,是一個「臭名昭著」的謎題,在幾個世紀以來,一直困擾著數學家。它在1993年被證明,而現在,數學家們有一個偉大計畫:用電腦把證明過程重現。他們希望在這個版本的證明中,如果有任何邏輯上的錯誤,都可以由電腦檢查出來。專案網址:https://github.com/riccardobrasca/flt

PHP、Vue和React:如何選擇最適合的前端框架? PHP、Vue和React:如何選擇最適合的前端框架? Mar 15, 2024 pm 05:48 PM

PHP、Vue和React:如何選擇最適合的前端框架?隨著互聯網技術的不斷發展,前端框架在Web開發中起著至關重要的作用。 PHP、Vue和React作為三種代表性的前端框架,每一種都具有其獨特的特徵和優勢。在選擇使用哪種前端框架時,開發人員需要根據專案需求、團隊技能和個人偏好做出明智的決策。本文將透過比較PHP、Vue和React這三種前端框架的特徵和使

織夢CMS站群實作分享 織夢CMS站群實作分享 Mar 18, 2024 am 10:18 AM

織夢CMS站群實務分享近年來,隨著網路的快速發展,網站建置變得越來越重要。在建立多個網站時,站群技術成為了一個非常有效的方法。而在眾多網站建立工具中,織夢CMS憑藉其靈活性和易用性成為了不少站群愛好者的首選。本文將分享一些關於織夢CMS站群的實務經驗,以及一些具體的程式碼範例,希望能為正在探索站群技術的讀者提供一些幫助。 1.什麼是織夢CMS站群?織夢CMS

Java框架與前端React框架的整合 Java框架與前端React框架的整合 Jun 01, 2024 pm 03:16 PM

Java框架與React框架的整合:步驟:設定後端Java框架。建立專案結構。配置建置工具。建立React應用程式。編寫RESTAPI端點。配置通訊機制。實戰案例(SpringBoot+React):Java程式碼:定義RESTfulAPI控制器。 React程式碼:取得並顯示API回傳的資料。

PHP編碼實踐:拒絕使用goto語句的替代方案 PHP編碼實踐:拒絕使用goto語句的替代方案 Mar 28, 2024 pm 09:24 PM

PHP編碼實踐:拒絕使用goto語句的替代方案近年來,隨著程式語言的不斷更新和迭代,程式設計師開始更加重視編碼規範和最佳實踐。在PHP程式設計中,goto語句作為一種控制流語句存在已久,但在實際應用中往往會導致程式碼的可讀性和可維護性下降。本文將分享一些替代方案,幫助開發人員拒絕使用goto語句,提升程式碼品質。一、為什麼拒絕使用goto語句?首先,讓我們來思考一下為

使用Golang進行流量管理的最佳實踐 使用Golang進行流量管理的最佳實踐 Mar 07, 2024 am 08:27 AM

Golang是一種強大且高效的程式語言,廣泛應用於建立網路服務和應用程式。在網路服務中,流量管理是至關重要的一環,它可以幫助我們控制和優化網路上的資料傳輸,保障服務的穩定性和效能。本文將介紹使用Golang進行流量管理的最佳實踐,並提供具體的程式碼範例。 1.使用Golang的net包進行基本的流量管理Golang的net包提供了處理網路數

使用 Golang 實現頁面跳躍的最佳實踐 使用 Golang 實現頁面跳躍的最佳實踐 Mar 05, 2024 pm 01:18 PM

使用Golang實現頁面跳轉的最佳實踐在開發web應用程式時,頁面跳轉是一個常見的功能需求。在Golang中,我們可以使用一些函式庫來實現頁面跳轉,例如使用Gin框架來處理路由和頁面跳轉。本文將介紹如何在Golang中實現頁面跳轉的最佳實踐,同時給出具體的程式碼範例。 Gin框架簡介Gin是一個用Go語言寫的web框架,功能強大且容易

vue.js vs.反應:特定於項目的考慮因素 vue.js vs.反應:特定於項目的考慮因素 Apr 09, 2025 am 12:01 AM

Vue.js適合中小型項目和快速迭代,React適用於大型複雜應用。 1)Vue.js易於上手,適用於團隊經驗不足或項目規模較小的情況。 2)React的生態系統更豐富,適合有高性能需求和復雜功能需求的項目。

See all articles