Connect Redux and Effects-as-data
This module contains Redux cmds and handlers for a seamless Redux and effects-as-data connection. It also exposes helper functions to autogenerate cmds and effects-as-data functions from Redux actions.
This module is meant to be used with effects-as-data.
Installation
npm i effects-as-data-redux --save
How it works
Data flow
- Redux passes state to React using
react-redux
.
- React handles UI events and calls effects-as-data functions that have been passed in as props.
- Effect-as-data dispatches Redux actions.
Using effects-as-data to control Redux further decouples the view layer from Redux and gives you the full power of effects-as-data to execute business logic and dispatch Redux actions at the appropriate times. This breaks the (IMHO) bad habit of using the Redux dispatch cycle as a general purpose message bus for the application and instead allows Redux to be used only for dispatching actions for state mutation.
Usage
Using commands
export const setUser = (payload) => { type: 'SET_USER', payload }
import * as actions from './actions'
import { generateCmdsFromActions } from 'effects-as-data-redux'
import { cmds } from 'effects-as-data-universal'
const reduxCmds = generateCmdsFromActions(actions)
export default {
state: reduxCmds,
...cmds
}
import cmds from './cmds'
function * setUser (id) {
const user = yield cmds.httpGet(`https://example.com/api/users/${id}`)
yield cmds.state.setUser(user)
}
Setting up handlers
import { handlers } from 'effects-as-data-universal'
import { buildReduxHandlers } from 'effects-as-data-redux'
export default (store) => ({
...buildReduxHandlers(store),
handlers
})
Generating effects-as-data functions
import { buildFunctions } from 'effects-as-data'
import { generateFunctionsFromActions } from 'effects-as-data-redux'
import buildHandlers from './handlers'
import functions from './functions'
import * as reduxActions from './actions'
const reduxFunctions = generateFunctionsFromActions(reduxActions)
const allFunctions = {
...functions,
...reduxFunctions
}
const config = {
onCommandComplete: console.log
}
const store = createStore()
const handlers = buildHandlers(store)
export default buildFunctions(config, handlers, allFunctions)