1.1.0 • Published 10 years ago
reducer-sandbox v1.1.0
reducer-sandbox

reducer-sandbox helps you to reuse your redux reducers in different place without conflict them.
Getting started
Install reducer-sandbox using npm:
npm install reducer-sandbox --saveThen using ES6
import counterReducer from './reducers/counter';
import reducerSandbox from 'reducer-sandbox';
const sandbox = reducerSandbox(counterReducer, {
key: 'metadata.sandboxid',
id: 'stats-counter',
});Using ES5
var counterReducer = require('./reducers/counter');
var reducerSandbox = require('reducer-sandbox');
var sandbox = reducerSandbox(counterReducer, {
key: 'metadata.sandboxid',
id: 'stats-counter',
});Usage
Take this piece of code:
import redux from 'redux';
import counterReducer from './reducers/counter';
const reducers = redux.combineReducers({
statsCounter: counterReducer,
itemsCounter: counterReducer,
});
const store = reducer.createStore(reducers);This will increment both counter from statsCounter and itemsCounter:
store.dispatch({type: 'INCREMENT'});
store.getState(); //=> {statsCounter: {counter: 1}, itemsCounter: {counter: 1}}If you want to only increment statsCounter, then you can reducer-sandbox.
Let's do it:
import redux from 'redux';
import reducerSandbox from 'reducer-sandbox';
import counterReducer from './reducers/counter';
const statsCounter = reducerSandbox(counterReducer);
const itemsCounter = reducerSandbox(counterReducer);
const reducers = redux.combineReducers({
statsCounter: statsCounter.reducer,
itemsCounter: itemsCounter.reducer,
});
const store = reducer.createStore(reducers);
store.getState(); //=> {statsCounter: {counter: 0}, itemsCounter: {counter: 0}}Now if you want to only increment statsCounter, you have 4 choices.
- First is using
bindToActionhelper:store.dispatch(statsCounter.bindToAction({type: 'INCREMENT'})); store.getState(); //=> {statsCounter: {counter: 1}, itemsCounter: {counter: 0}} Second is using
dispatcherhelper:const dispatchStatsCounter = statsCounter.dispatcher(store); dispatchStatsCounter({type: 'INCREMENT'}); store.getState(); //=> {statsCounter: {counter: 2}, itemsCounter: {counter: 0}}Third is using
bindToActionCreatorhelper:const increment = () => {type: 'INCREMENT'}; const statsIncrement = statsCounter.bindToActionCreator(increment); store.dispatch(statsIncrement()); store.getState(); //=> {statsCounter: {counter: 3}, itemsCounter: {counter: 0}}Fourth is using
bindToActionCreatorshelper:const actions = { increment: () => {type: 'INCREMENT'}, decrement: () => {type: 'DECREMENT'}, }; const statsActions = statsCounter.bindToActionCreators(actions); store.dispatch(statsActions.increment()); store.getState(); //=> {statsCounter: {counter: 4}, itemsCounter: {counter: 0}}
Examples
Links
renumis a small library to create enum using frozen objects in javascript from multiple sources.reducer-chainhelps you to chainreduxreducers with given state and action, then keep last updated state.reducer-pipehelps you to pipereduxreducers with given state and action, passing previously returned state to next reducer, then keep last updated state.