defaults
Set defaults directly in reducers
There are two ways to pass defaults to reducers. We've been using this style until now:
import { kea, reducers } from 'kea'
const logic = kea([
reducers({
counter: [
0, // defaults to 0
{
increment: (state, { amount }) => state + amount,
decrement: (state, { amount }) => state - amount,
},
],
}),
])
Use defaults
builder
You can also set your defaults explicitly with a defaults
builder:
import { kea, defaults, reducers } from 'kea'
const logic = kea([
defaults({
counter: 0,
}),
reducers({
counter: {
increment: (state, { amount }) => state + amount,
decrement: (state, { amount }) => state - amount,
},
}),
])
Precedence
In case you pass both, the default passed earlier via defaults
will take precedence over the one in reducers
.
Selectors as defaults
You can pass selectors as defaults to compute them on the fly.
import { kea, defaults, reducers } from 'kea'
const counterLogic = kea([])
const logic = kea([
// must be a function to evaluate at build time after counterLogic has mounted
defaults(() => ({
counterCopy: counterLogic.selectors.counter,
})),
reducers(() => ({
counterCopy: [
counterLogic.selectors.counter,
{
increment: (state, { amount }) => state + amount,
decrement: (state, { amount }) => state - amount,
},
],
})),
])
You can take it one level deeper and return a selector that computes the defaults:
import { kea, defaults } from 'kea'
const logic = kea([
defaults(() => (state, props) => ({
// simple value
simpleDefault: 0,
// returning a selector
directName: someLogic.selectors.storedName,
// returning a value through a selector
connectedName: someLogic.selectors.storedObject(state, props).name,
})),
])
Questions & Answers
Ask questions about this page here.