@aikoven/recombine

Utilities for combining Redux reducers

Stats

stars 🌟issues ⚠️updated 🛠created 🐣size 🏋️‍♀️
10Jun 13, 2018Mar 29, 2017Minified + gzip package size for @aikoven/recombine in KB

Readme

Recombine npm version Build Status

Utilities for combining Redux reducers

Installation

npm install --save @aikoven/recombine

API

combineReducers(reducers: ReducerMapObjectWithExtraArgs): ReducerWithExtraArgs

Same as original combineReducers from Redux but returned reducer accepts extra arguments and passes them to each child reducer.

Example

Construct reducer that manages state where one branch depends on another:

import {combineReducers} from "@aikoven/recombine";

// for regular reducers `combineReducers` behaves exactly the same as original
const firstBranchReducer = combineReducers({
  something(state = ..., action) {/*...*/},
  somethingElse(state = ..., action) {/*...*/},
});

// created reducer forwards any extra args to child reducers
const secondBranchReducer = combineReducers({
  someKey(state = ..., action, firstBranch) {/*...*/},
  anotherKey(state = ..., action, firstBranch) {/*...*/},
});

const reducer = (state = {}, action) => {
  // compute first branch and pass results to the second branch
  const {firstBranch, secondBranch} = state;

  const nextFirstBranch = firstBranchReducer(firstBranch, action);
  const nextSecondBranch = secondBranchReducer(secondBranch, action, nextFirstBranch);

  if (nextFirstBranch !== firstBranch || nextSecondBranch !== secondBranch)
    return {firstBranch: nextFirstBranch, secondBranch: nextSecondBranch};

  return state;
};

dictionaryReducer(childReducer: Reducer, addKey?: Function, removeKey?: Function, initialState?: Object): Reducer

Create reducer that manages key-value dictionary state with values of same shape. Child reducer is called on every action for each dictionary value, and dictionary key is supplied to the child reducer as third argument.

Any extra arguments for resulting reducer are passed to the child reducer following dictionary key.

Parameters

  • childReducer: Reducer for dictionary values. Receives dictionary key as
                  third argument.
    
  • addKey?: Function that will be called on every action to determine
                  whether that action should result in adding a new key to the
                  dictionary, in which case it should return the key.
    
  • removeKey?: Function that will be called on every action to determine
                  whether that action should result in removing a key from the
                  dictionary, in which case it should return the key.
    
  • initialState = {}: Initial state for resulting reducer.

Roadmap

  • More documentation covering rationale and use cases.
  • More tests

If you find any bugs or have a feature request, please open an issue on github!

The npm package download data comes from npm's download counts api and package details come from npms.io.