Introduction
Feeling tedious to write redudx action
and reducer
in seperate files?
Not sure what is the state shape
created by your reducers
?
Don't know what action type
deals with what reducer
?
redux-shape
make it easy to create a state shape
by a shape
definition. With the shape
defined, your action type and reducer will be determined.
Installation
npm install --save redux-shape
Examples
Concepts
redux-shape
has two concepts.
leaf
leaf
defines your leaf node of the shape
and it's where you write your reducers
and state
on which the reducers
work.
let leaf = state:"" reducers: { let text = actiontext return text; } { return ''; }
shape
shape
defines your state shape with leaf
.
let shape = leaf// a leaf should be returned inside a function.
Usage
let leaf = state:"" reducers: { let text = actiontext return text; } { return ''; } let shape = leaf// a leaf should be returned inside a function. let reducer = let store =
This code snippet create a redux store
using the reducer generated by redux-shape
. Note that you should pass combineReducers
of redux
to redux-shape.
If you call store.getState()
,you will get an object:
text:''
You can change your state by dispatching an action.
store
And now your state will be
text:'I am a text'
Action type
After you apply your shape
, action types are determined. Action types follow this pattern:
<shapeProperty><delimiter><reducerName>
So for the shape
let shape = leaf// a leaf should be returned inside a function.
you can change text by store.dispatch({type:'text.changeText',text:'some text'})
, and clear text by store.dispatch({type:'text.clearText'})
(changeText and clearText reducers are defined in leaf
).
nested state support
Assume that you have defined a nested state (note:nested state is not recommended in a redux app) shape as:
let nestedShape = {
a:{
text:()=>leaf
},
b:{
text:()=>leaf
}
}
You can change state.a.text
by store.dispatch({type:'a.text.changeText',text:'some text'})
, and change state.b.text
by store.dispatch({type:'b.text.changeText',text:'some text'})
.
Integrate with react-router-redux
You can integrate redux-shape with react-router-redux easily if you want to use react-router in you app.
react-router-redux need to add custom reducers to store, we can use custom config like below:
let leaf = state:"" reducers: { let text = actiontext return text; } { return ''; } let shape = leaf// a leaf should be returned inside a function. let reducer = let store =