项目作者: marcelmokos

项目描述 :
#archived: redux create reducer, action type and action creator
高级语言: JavaScript
项目地址: git://github.com/marcelmokos/redux-create.git
创建时间: 2016-12-20T21:32:38Z
项目社区:https://github.com/marcelmokos/redux-create

开源协议:MIT License

下载


Archived

This project is no longer maintained. Please use typesafe-actions as they are better.

redux-create

redux create reducer, action creator, async action creator, action type

npm version styled with prettier Build Status Coverage Status dependency devDep
Known Vulnerabilities

Create a Reducer

  • creates nested reducer without need of writing switch statement

Usage:

Javascript:

  1. const selectedProduct = createReducer(state = null, {
  2. [PRODUCT]: {
  3. [SELECT]: (state, payload) => payload,
  4. [TOGGLE]: (state, payload) => state === payload ? null : payload,
  5. [UNSELECT]: () => null,
  6. }
  7. });

TypeScript, Flow Type:

  1. const selectedProduct = createReducer(state: null | number = null, {
  2. [PRODUCT]: {
  3. [SELECT]: (state, payload) => payload,
  4. [TOGGLE]: (state, payload) => state === payload ? null : payload,
  5. [UNSELECT]: () => null,
  6. }
  7. });

same code written using switch

  1. const selectedProduct = (state = null, action) => {
  2. switch (action.type) {
  3. case PRODUCT_SELECT:
  4. return action.payload;
  5. case PRODUCT_TOGGLE:
  6. return state === action.payload ? null : action.payload;
  7. case PRODUCT_UNSELECT:
  8. return null;
  9. default:
  10. return state;
  11. }
  12. };

Create Action Creator

  • creates Action Creator from one or more strings
  • calling the created Action Creator will return Action Object of shape {type: string, payload: any}

Javascript:

  1. const createProduct = createActionCreator(PRODUCT_CREATE)
  2. const productData = {id: 1, name: "test"}
  3. createProduct(productData) // {type: "PRODUCT_CREATE", payload: {id: 1, name: "test"}}

TypeScript:

  1. interface IProduct {
  2. id: number;
  3. name: string;
  4. }
  5. const createProduct = createActionCreator<IProduct>(PRODUCT_CREATE)
  6. const productData: IProduct = {id: 1, name: "test"}
  7. createProduct(productData) // {type: "PRODUCT_CREATE", payload: {id: 1, name: "test"}}

Flow Type:

  1. declare type TProduct = {
  2. id: number;
  3. name: string;
  4. }
  5. const createProduct = createActionCreator<TProduct>(PRODUCT_CREATE)
  6. const productData: TProduct = {id: 1, name: "test"}
  7. createProduct(productData) // {type: "PRODUCT_CREATE", payload: {id: 1, name: "test"}}

Create an Async Action Creator

  • creates object containing Action Creators for async operations (request, success, failure)
  1. const asyncActionType = {
  2. REQUEST: "REQUEST",
  3. SUCCESS: "SUCCESS",
  4. FAILURE: "FAILURE",
  5. };
  6. const createAsyncActionCreator = (...type) => ({
  7. request: createActionCreator(type, asyncActionType.REQUEST),
  8. success: createActionCreator(type, asyncActionType.SUCCESS),
  9. failure: createActionCreator(type, asyncActionType.FAILURE),
  10. });

Usage:

Javascript:

  1. export const fetchProductsAction = createAsyncActionCreator(FETCH_PRODUCTS);
  2. export const fetchProducts = () => (dispatch) => {
  3. dispatch(fetchProductsAction.request());
  4. productsApi.fetchProducts().then(
  5. (payload) => dispatch(fetchProductsAction.success(payload)),
  6. (error) => dispatch(fetchProductsAction.failure(error)),
  7. );
  8. };

TypeScript:

  1. interface IErrorPayload {
  2. message: string;
  3. }
  4. export const fetchProductsAction = createAsyncActionCreator<{}, IProduct[], IErrorPayload>(FETCH_PRODUCTS);
  5. export const fetchProducts = () => (dispatch) => {
  6. dispatch(fetchProductsAction.request());
  7. productsApi.fetchProducts().then(
  8. (payload) => dispatch(fetchProductsAction.success(payload)),
  9. (error) => dispatch(fetchProductsAction.failure(error)),
  10. );
  11. };

Flow Type:

  1. declare type TErrorPayload = {
  2. message: string;
  3. }
  4. export const fetchProductsAction = createAsyncActionCreator<{}, TProduct[], TErrorPayload>(FETCH_PRODUCTS);
  5. export const fetchProducts = () => (dispatch) => {
  6. dispatch(fetchProductsAction.request());
  7. productsApi.fetchProducts().then(
  8. (payload) => dispatch(fetchProductsAction.success(payload)),
  9. (error) => dispatch(fetchProductsAction.failure(error)),
  10. );
  11. };

Create Action Type

  • creates action type from one or more strings
  • exposed helper method can be replaced with template strings
  1. const PRODUCT = "PRODUCT";
  2. const CATEGORY = "CATEGORY";
  3. const SELECT = "SELECT";
  4. const CREATE = "CREATE";
  5. const UPDATE = "UPDATE";
  6. const DELETE = "DELETE";
  7. const PRODUCT_SELECT = createActionType(PRODUCT, SELECT) // "PRODUCT_SELECT";
  8. const PRODUCT_CREATE = createActionType(PRODUCT, CREATE) // "PRODUCT_CREATE";
  9. const PRODUCT_UPDATE = createActionType(PRODUCT, UPDATE) // "PRODUCT_UPDATE";
  10. const PRODUCT_DELETE = createActionType(PRODUCT, DELETE) // "PRODUCT_DELETE";
  11. ...

Adding flow support

  • add this line to your .flowconfig to get flowtypes in your project
  1. [include]
  2. ./node_modules/redux-create/flow-typed/
  • flow coverage
    ```javascript
    $ flow coverage ./src/index.js —color
    import createActionType from “./createActionType”;
    import createActionCreator from “./createActionCreator”;
    import {
    asyncAction,
    createAsyncActionCreator,
    } from “./createAsyncActionCreator”;
    import createReducer from “./createReducer”;

export {
createActionType,
createActionCreator,
asyncAction,
createAsyncActionCreator,
createReducer,
};

Covered: 100.00% (0 of 0 expressions)
```