DEV Community

Cover image for Redux reimplemented in 12 lines of code
Dale L. Jefferson
Dale L. Jefferson

Posted on • Edited on • Originally published at dalejefferson.com

Redux reimplemented in 12 lines of code

I like to reimplement libraries I use, this allows me to better understand how they work, below is my minimal implementation of Redux.

const createStore = reducer => { let onChange; let state = reducer(undefined, {}); return { getState: () => state, subscribe: fn => (onChange = fn), dispatch: action => { state = reducer(state, action); onChange(); } }; }; 

This works with the example on the Redux homepage below.

const counter = (state = 0, action) => { switch (action.type) { case "INCREMENT": return state + 1; case "DECREMENT": return state - 1; default: return state; } }; const store = createStore(counter); store.subscribe(() => console.log(store.getState())); store.dispatch({type: "INCREMENT"}); // 1 store.dispatch({type: "INCREMENT"}); // 2 store.dispatch({type: "DECREMENT"}); // 1 

Obviously this only has a fraction of the real Redux API.

Top comments (1)

Collapse
 
vonheikemen profile image
Heiker

And with a few more you can have redux-thunk.

const createStore = reducer => { let onChange; let state = reducer(undefined, {}); + let store = { - return {  getState: () => state, subscribe: fn => (onChange = fn), dispatch: action => { + if(typeof action === 'function') { + return action(store.dispatch, store.getState); + } +  state = reducer(state, action); onChange(); } }; + return store; }; 

A bit intrusive but it does the job.