docs/recipes/atom-with-refresh-and-default.mdx
This is for another implementation of atomWithDefault
As you can see in the example code in atomWithDefault section, the two atoms' relation is disconnected after updating created one, count2Atom = atomWithDefault((get) => get(count1Atom) * 2).
Let's confirm what's occurred,
Those atoms have no relation after updating count2Atom. So,
In some cases,
How do we make those cases? Here is a declarative way to create a function to provide a refreshable atom instead of atomWithDefault.
const refreshCountAtom = atom(0)
const baseDataAtom = atom(1) // original data, e.g. base count1Atom
const dataAtom = atom(
(get) => {
get(refreshCountAtom) // it's introduced at atomWithRefresh
return get(baseDataAtom)
},
(get, set, update) => {
set(baseDataAtom, update)
},
)
const atomWithRefreshAndDefault = (refreshAtom, getDefault) => {
const overwrittenAtom = atom(null)
return atom(
(get) => {
const lastState = get(overwrittenAtom)
if (lastState && lastState.refresh === get(refreshAtom)) {
return lastState.value
}
return getDefault(get)
},
(get, set, update) => {
set(overwrittenAtom, { refresh: get(refreshAtom), value: update })
},
)
}
// This is an alternative of `atomWithDefault((get) => get(count1Atom) * 2)`
const refreshableAtom = atomWithRefreshAndDefault(
refreshCountAtom,
(get) => get(dataAtom) * 2,
)
// You can reset by updating just one atom
const resetRootAtom = atom(null, (get, set) => {
set(refreshCountAtom, get(refreshCountAtom) + 1)
})