Thunks
Thunks are simple ways to define side effects with Redux.
Installation
First install the kea-thunk
and redux-thunk
packages:
# if you're using yarn
yarn add kea-thunk redux-thunk
# if you're using npm
npm install --save kea-thunk redux-thunk
Then you have install the plugin:
import thunkPlugin from 'kea-thunk'
import { resetContext } from 'kea'
resetContext({
createStore: true,
plugins: [ thunkPlugin ]
})
Usage
You define thunks in a block called thunks
. Here are some examples:
const delay = (ms) => new Promise(resolve => window.setTimeout(resolve, ms))
const logic = kea({
actions: ({ constants }) => ({
updateName: name => ({ name })
}),
thunks: ({ actions, dispatch, getState }) => ({
updateNameAsync: async name => {
await delay(1000) // standard promise
await actions.anotherThunk() // another thunk action
actions.updateName(name) // not a thunk, so no async needed
dispatch({ type: 'RANDOM_REDUX_ACTION' }) // random redux action
console.log(values.name) // 'chirpy'
console.log(values.otherKey) // undefined
},
anotherThunk: async () => {
// do something
}
}),
reducers: ({ actions, constants }) => ({
name: ['chirpy', {
[actions.updateName]: (state, payload) => payload.name
}]
})
})
As you can see, you have access to the standard Redux dispatch
and getState
methods. However you don't need to call dispatch
before any action in the actions object. They are wrapped automatically.