Skip to main content

Redux Setup

With configureStore we get hold of the global store object. At the same time we can pass a configuration to initialize our feature reducers, meta reducers, initial state and extensions.

configureStore​

At first, we do not need any configuration to get started.

Let`s just get hold of the store instance:

import { configureStore, Store } from 'mini-rx-store';

const store: Store = configureStore({});

With the Store instance we can already add reducers (dynamically), select state, dispatch actions and create effects.

Feature Reducers​

We can configure the feature reducers via the configuration object. The reducers will be ready at store initialization.

import { configureStore, Store } from 'mini-rx-store';
import productReducer from './product-reducer';
import userReducer from './user-reducer';

const store: Store = configureStore({
reducers: {
product: productReducer,
user: userReducer
}
});

Add Feature Reducers dynamically​

It is possible to add feature reducers dynamically later like this:

import todoReducer from './todo-reducer';

store.feature('todo', todoReducer);

Initial State​

We can set the initial state of the store via the configuration object. The initial state keys must match the provided reducer keys:

import { configureStore, Store } from 'mini-rx-store';
import { productReducer } from './product-reducer';
import { userReducer } from './user-reducer';

const store: Store = configureStore({
reducers: {
product: productReducer,
user: userReducer
},
initialState: {
product: {},
user: {}
}
});

See how the initial state is available in a feature reducer:

import { Action, Store, configureStore } from 'mini-rx-store';

interface CounterState {
count: number;
}

// Reducer
function counterReducer(state: CounterState, action: Action): CounterState {
switch (action.type) {
case 'inc':
return {
...state,
count: state.count + 1
};
default:
return state;
}
}

// Configure the store
const store: Store = configureStore({
reducers: {
counter: counterReducer
},
initialState: {
counter: {count: 123}
}
});

// Select global state
store.select(state => state).subscribe(console.log);
// OUTPUT: {'counter':{'count':123}}

// Dispatch the 'increment' action
store.dispatch({ type: 'inc' });
// OUTPUT: {'counter':{'count':124}}

Meta reducers​

Meta reducers are executed before the "normal" feature reducers. With meta reducers we can pre-process actions and state.

info

Most MiniRx Extensions like the Undo Extension, Logger Extension or the Immutable Extension are implemented with a meta reducer.

A meta reducer is a function which takes a reducer and returns a new reducer.

Let's see how to implement a simple Debug meta reducer:

export function debug(reducer) {
return function newReducer(state, action) {
const nextState = reducer(state, action);
console.log('state', state);
console.log('action', action);
console.log('next state', nextState);
return nextState;
}
}

Now we can add the debug meta reducer to the metaReducers array of the configuration object:

const store: Store = configureStore({
// reducers: {...},
// initialState: {...},
metaReducers: [debug]
});

You can add many meta reducers to the array. The meta reducers will be executed from "left to right".