反応ミドルウェアにおけるサンクとサガの違い: 1. [redux-thunk] はオリジナルのオブジェクト [(プレーンオブジェクト)] のみをサポートし、副作用のあるアクションを処理します; 2. [redux-saga] はすべての For を処理します非同期操作の場合、非同期インターフェイス部分は一目瞭然です。
このチュートリアルの動作環境: Windows7 システム、React17 バージョンこの方法は、すべてのブランドのコンピューターに適しています。
関連する学習の推奨事項: react ビデオ チュートリアル
##React ミドルウェアのサンクとサーガの違い:
1. redux-thunkの使い方と欠点
(1)redux-thunkthunkの使い方はreduxの作者が提供したミドルウェアです。実装は簡単で、10 行以上のコード:function createThunkMiddleware(extraArgument) { return ({ dispatch, getState }) => next => action => { if (typeof action === 'function') { return action(dispatch, getState, extraArgument); } return next(action); }; } const thunk = createThunkMiddleware(); thunk.withExtraArgument = createThunkMiddleware; export default thunk;
action(dispatch, getState, extraArgument);
import { createStore, applyMiddleware, compose } from 'redux'; import thunk from 'redux-thunk'; import rootReducer from './reducers/index'; const initialState = {}; const middleware = [thunk]; export const store = createStore( rootReducer, initialState, compose( applyMiddleware(...middleware), Windows.__REDUX_DEVTOOLS_EXTENSION__ && Windows.__REDUX_DEVTOOLS_EXTENSION__() ) );
を導入します。
import { FETCH_POSTS, NEW_POST } from './type' export const fetchPosts = () => dispatch => { fetch("https://jsonplaceholder.typicode.com/posts") .then(res => res.JSON()) .then(posts => dispatch({ type: FETCH_POSTS, payload: posts }) ) } export const createPost = postData => dispatch => { fetch("https://jsonplaceholder.typicode.com/posts",{ method: "POST", headers:{ "content-type":"application/json" }, body:JSON.stringify(postData) }) .then(res => res.JSON()) .then(post => dispatch({ type: NEW_POST, payload: post }) ) }
2. redux-saga の使用#redux-saga では、アクションはプレーン オブジェクト (元のオブジェクト) であり、すべての非同期操作を集中的に処理します。 redux-saga の使用について説明する例として、saga
shopping-cart を使用します。
この例は非常に単純で、次のプロセスを示しています:商品リスト --> 商品の追加 --> ショッピング カート --> お支払い
詳細ページは次のとおりです:
明らかに、2 つの明らかな非同期があります。実行する必要がある操作:
製品リストを取得して支払いを行う
Use
getAllProducts() および checkout()
は、次の場合を表します。 thunk が使用されている場合、これら 2 つの非同期操作は 2 つの異なるアクションに属しますが、saga では集中的に処理されます。saga を使用して、最初に非同期処理に焦点を当てた saga.JS ファイルを生成します。
import { put, takeEvery, call } from 'redux-saga/effects' import { CHANGE_HITOKOTO_RESP, CHANGE_HITOKOTO } from '../actions/Hitokoto' import hitokotoApi from '../services/hitokoto' function gethitokoto() { return hitokotoApi.get().then(resp => resp) } export function* changeHitokoto() { const defaultHitokoto = { 'id': 234, 'hitokoto': '没有谁能够永远坚强下去的, 每个人都会有疲累的无法站起的时候. 世间的故事, 就是为了这一刻而存在的哦.', 'type': 'a', 'from': '文学少女', 'creator': '酱七', 'created_at': '1468605914' }; try { const data = yield call(gethitokoto); const hitokotoData = JSON.parse(data); yield put({ type: CHANGE_HITOKOTO_RESP, hitokotoData }); } catch (error) { yield put({ type: CHANGE_HITOKOTO_RESP, hitokotoData: defaultHitokoto }); } } export default function* shici() { yield takeEvery(CHANGE_HITOKOTO, changeHitokoto) }
getAllProducts()
とcheckout() にこの 2 つが集中していることがわかります。
さらに、サガのアクションは元のオブジェクトとまったく同じです。サガのアクション クリエーターを見てみましょう :
export const GET_ALL_PRODUCTS = 'GET_ALL_PRODUCTS' export function getAllProducts() { return { type: GET_ALL_PRODUCTS, } }
利点:(1)すべて非同期操作は集中処理され、非同期インターフェイス部分は一目瞭然です。(2)Action は通常のオブジェクトであり、redux 同期アクションとまったく同じです
(3)結果、非同期インターフェイスのテストに便利です(4) ワーカーとウォッチャーを通じてノンブロッキング非同期呼び出しを実現でき、同時にノンブロッキング呼び出しでのイベント監視も実現できます
(5) 非同期操作のプロセスを制御でき、対応する非同期操作をいつでもキャンセルできます。欠点: 複雑すぎて学習コストが高くなります
関連学習の推奨:
以上がReactミドルウェアのサンクとサーガの違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。