1. redux flux
Flux:
redux
2. jsx virtual dom
3. reactJs redux
basically similar to the flux flow(redux is one flux implementation), in (react) redux, component (user action, for example click a button) would trigger/generate an action, the action are being wrapped(like a container) within redux, it has a list registered listener (reducer) would act on the action (in redux, action is a noun, like a domain object, to tell the type of the action, and any additional parameters), reducer could 1) construct a new state (from existing + the new action), then store them in the store; 2) or with thunk, if could really take some action, for example, call a rest service, then generate a new state
after the new state, (which is always maintained/persisted in the store), the interested component could listen (observer) to these state (mapStateToProps), then update the component (display) correspondingly.
4. set up store, reducer, thunk
const store = createStore( reducer, applyMiddleware(thunk) );
5. thunk
basically, “plain” redux, (supposed to be pure), only take in plain action (as a domain object, POJO); however, there are cases, it requires to run certain actions, (calling web service), with thunk, the “action” could be a function which then return a action(the real pojo).
export function getPosts_actionCreator_Thunk() { return function(dispatch) { return fetch("https://lwpro2.wordpress.com/super/posts") .then(response => response.json()) .then(json => { dispatch({ type: "POST_LOADED", payload: json }); }); }; }
6. saga
sage is another way to implement what thunk’s. to iterate, Redux does not understand other types of action than a plain object.(for redux, actions is plain domain object).
Thunk is a middleware to extend redux, so that a function (thunk function) is put into the action creator, which could be run, and then return the action (domain object).
While saga is working in another approach. Saga is like an interceptor. So the original action creator is same, which simply return a plain domain action. However, saga can intercept all actions, if it’s saga’s interested actions (listener/observer pattern), it then intercept into its logic (the call of web service for example).
export function getPosts_actionCreator_original() { return { type: "POST_LOADED" }; } export function loadPost_realFunction_original() { return fetch("https://lwpro2.wordpress.com/super/posts") .then(response => response.json()); } import { takeEvery, call, put } from "redux-saga/effects"; export default function* interceptor_observer_Saga() { yield takeEvery("POST_LOADED", workerSaga); } function* workerSaga() { try { const payload = yield call(loadPost_realFunction_original); yield put({ type: "POST_LOADED", payload }); } catch (e) { yield put({ type: "POST_LOAD_ERROR", payload: e }); } }