Opinionated Redux
our toolkit and best practices
Adam Klein
Developer, Consultant, Trainer

CEO @ 500Tech
Adam Klein
Tools & Best Practices
Immutability
lodash/fp
Immutability
lodash/fp
Immutability
set('inner.property', 'value', state);
lodash/fp
Immutability
set('inner.property', 'value', state);
{
...state,
inner: {
...state.inner,
property: 'value'
}
}
lodash/fp
Immutability
set('inner.property', 'value', state);
{
...state,
inner: {
...state.inner,
property: 'value'
}
}
lodash/fp
Immutability
redux-freeze
lodash/fp
Immutability
use only in development
redux-freeze
lodash/fp
Immutability
ImmutableJS
redux-freeze
Reducers
Reducers
import { handleActions } from 'redux-actions';
const myReducer = handleActions(
{
[MY_ACTION]: (state: MyState, action: MyAction): MyState =>
set('key', action.payload, state)
},
...
);
Reducers
import { handleActions } from 'redux-actions';
const myReducer = handleActions(
{
[MY_ACTION]: (state: MyState, action: MyAction): MyState =>
set('key', action.payload, state)
},
...
);
Selectors
Selectors
- store
- reducers
- selectors
- actions
Selectors
posts comments
selector
reducer reducer
- store
- reducers
- selectors
- actions
Selectors
state valueFunctionstate valueReselect
Selectors
state
value
access
Function
state
computed
value
Reselect
Selectors
state
value
access
Function
state
computed
value
Reselect
Selectors
state
value
access
Function
state
computed
value
Reselect
Side-Effects
Side-Effects
Middlewares
Side-Effects
Middlewares
API
Middleware
Start Loading
End Loading
Success ActionFetch Action
Side-Effects
Middlewares
thunk
saga
redux-observable
Side-Effects
Middlewares
thunk
saga
redux-observable
State
Design
State
Design
{
users: {
1: {
id: 1,
name: 'User1'
},
2: {
id: 2,
name: 'User2'
}
},
selectedUserIds: {
1: true
}
}
State
Design
{
users: {
1: {
id: 1,
name: 'User1'
},
2: {
id: 2,
name: 'User2'
}
},
selectedUserIds: {
1: true
}
}
State
Design
{
users: {
1: {
id: 1,
name: 'User1'
},
2: {
id: 2,
name: 'User2'
}
},
selectedUserIds: {
1: true
}
}
Reload server data
State
Design
{
users: {
1: {
id: 1,
name: 'User1'
},
2: {
id: 2,
name: 'User2'
}
},
selectedUserIds: {
1: true
}
}
Save & restore from

Localstorage
State
Design
{
network: {
users: 1
}
}
State
Design
State
Design
{
network: {
users: 0
}
}
State
Design
{
users: {
pendingRequests: 1,
data: {
...
}
},
groups: {
pendingRequests: 1,
data: {
...
}
}
}
{
network: {
users: 0,
groups: 0
}
}
State
Design
const reducer = compose(
withLoading
withSelection
withTags,
withPermissions
)(usersReducer)
Higher-order reducers
Time for Questions
Opinionated Approach to Redux

Opinionated Approach to Redux