react-use-middleware-hook
An enhanced version of react useReducer hook for handling asynchronous logics with your own middlewares.
Middleware is a function that takes an action from dispatch, process some sync/async logics, and passes the action to reducer.
Be aware that it is not compatible with redux-middlewares.
Demo
Getting started
Installation
$ npm install react-use-middleware-hook
$ yarn add react-use-middleware-hook
Usage
Syntax
const state dispatch = ;
- reducer
- Type:
Function
- A pure function of type
(state, action) => newState
- Type:
- initialState(optional)
- Type:
any
- Type:
- middleware(optional)
- Type:
Function
orObject
orArray
- A function or a collection of functions of type
payload => newPayload
- Name of functions must be same as action types. Check below examples for detail.
- Type:
Example
React useMiddleware hook provides two ways to use it.
- with middleware
- without middleware
Although both ways work fine, using middleware is recommended in the point of SOC(separation of concerns).
With middleware
With middleware, useMiddleware hook accepts a middleware or collection of middlewares as 3rd parameter.
Middlewares may contain asynchronous logics.
//App.jsximport useMiddleware from "react-use-middleware-hook";import loading getPost end from "./actions";import reducer from "./reducer";import middleware from "./middleware"; { const state dispatch = ; const getPost = async { ; await ; ; }; return; /* some elements */}
//actions.jsconst loading = type: "loading" ;const end = type: "end" ;const getPost = type: "getPost" payload: postId ;const fetchError = type: "fetchError" payload: err ;
//middleware.jsimport * as actions from "./actions"; //middleware function accepts a payload which dispatched from an action,//and returns a new payload or triggers a different action.const getPost = async { try const res = await ; const data = await res; return data; catch err actions; return actions; }; getPost ; //exports an object which contains middleware functions in it.
//reducer.jsconst reducer = state type payload switch type case "loading": return ...state status: "loading" ; case "end": return ...state status: "end" ; case "getPost": return ...state data: payload ; case "fetchError": return ...state error: payload ; default: return state; ;;
Without middleware
Without middleware, leave the 3rd parameter empty. In this case, actions may contain asynchronous logics.
//App.jsximport useMiddleware from "react-use-middleware-hook";import loading getPost end from "./action";import reducer from "./reducer"; { const state dispatch = ; const getPost = async { ; await ; ; }; return; /* some elements */}
//actions.jsconst loading = type: "loading" ;const end = type: "end" ; const getPost = async { try const res = await ; const data = await res; return type: "getPost" payload: data ; catch err return ; }; const fetchError = type: "fetchError" payload: err ;
//reducer.jsconst reducer = state type payload switch type case "loading": return ...state status: "loading" ; case "end": return ...state status: "end" ; case "getPost": return ...state data: payload ; case "fetchError": return ...state error: payload ; default: return state; ;;