Interface representing the data structure of the initStores()
method's output.
Copy import type { EqualityChecker } from 'zustand'
type InitStoresType<StoresDataType> = {
stores: {
[StoreNameType in keyof StoresDataType]: CreateStoreType<
StoresDataType[StoreNameType]
>
} & {
rehydrate: () => Promise<boolean>
reset: (options?: InitStoresResetOptionsType<StoresDataType>) => void
}
useStores: <StoreNameType extends keyof StoresDataType, Output>(
storeName: StoreNameType,
selector: (data: StoresDataType[StoreNameType]) => Output,
equalityFn?: EqualityChecker<Output>
) => Output
}
API reference
stores
Copy stores: {
[StoreNameType in keyof StoresDataType]: CreateStoreType<
StoresDataType[StoreNameType]
>
} & {
rehydrate: () => Promise<boolean>
reset: (options?: InitStoresResetOptionsType<StoresDataType>) => void
}
stores.{storeName}
You can directly access all the zustand stores you provided to initStores()
via the stores
key. Example:
Copy type StoresDataType = {
nike: { name: string }
fila: { name: string }
}
const nikeStore = createStore<StoresDataType['nike']>('nike', { name: 'Nike' })
const filaStore = createStore<StoresDataType['fila']>('fila', { name: 'fila' })
const { stores } = initStores<StoresDataType>([nikeStore, filaStore])
const nikeStoreName = stores.nike.getState().name // 'Nike'
const filaStoreName = stores.fila.getState().name // 'fila'
stores.rehydrate
Promise that allows you to manually rehydrate all the stores provided to initStores()
that have the persist
middleware enabled. Example:
Copy type StoresDataType = {
nike: { name: string }
fila: { name: string }
}
const nikeStore = createStore<StoresDataType['nike']>('nike', { name: 'Nike' })
const filaStore = createStore<StoresDataType['fila']>('fila', { name: 'fila' })
const { stores } = initStores<StoresDataType>([nikeStore, filaStore])
await stores.rehydrate() // returns `true` upon completion
You shouldn't need to use this function as zustand stores rehydrate automatically:
if you want to perform some actions upon rehydration, look into the onRehydrateStorage
PersistOptions.
stores.reset
Function that allows you to reset all (or part) of the stores you provided to initStores()
. Example:
Copy type StoresDataType = {
fb: { company: string }
ggl: { company: string }
}
const fbStore = createStore<StoresDataType['fb']>('fb', { company: 'Facebook' })
const googleStore = createStore<StoresDataType['ggl']>('ggl', { company: 'Google' })
const { stores } = initStores<StoresDataType>([fbStore, googleStore])
stores.fb.getState().update(data => {
data.company = 'Meta'
})
stores.ggl.getState().update(data => {
data.company = 'Alphabet'
})
stores.reset({ omit: ['fb'] })
stores.fb.getState().data.company === 'Meta' // true, fbStore was omitted
stores.ggl.getState().data.company === 'Google' // true, googleStore was reset
stores.reset()
stores.fb.getState().data.company === 'Meta' // false, fbStore was reset as well now
useStores
Copy useStores: <StoreNameType extends keyof StoresDataType, Output>(
storeName: StoreNameType,
selector: (data: StoresDataType[StoreNameType]) => Output,
equalityFn?: EqualityChecker<Output>
) => Output
React Hook that allows you to consume the data
from any of the store you provided to initStores()
.
You'd use it exactly like you'd use a regular zustand store Hook, with the only difference that useStores()
expects the name of the store you want to get data from as its initial argument . Example:
Copy import shallow from 'zustand/shallow'
type StoresDataType = {
wishlist: { nextPurchase: string }
friends: { best: string }
}
const storeA = createStore<StoresDataType['wishlist']>('wishlist', {
nextPurchase: 'Watch',
})
const storeB = createStore<StoresDataType['friends']>('friends', {
best: 'TBD',
})
const { useStores } = initStores<StoresDataType>([storeA, storeB])
const Component = () => {
const bestFriendName = useStores('friends', data => data.best) // TBD
const nextItemToPurchase = useStores(
'wishlist',
data => data.nextPurchase,
shallow
) // 'Watch'
return null
}
useStores()
really shines when you have a lot of stores in your app and don't want to have to import a lot of them/have a hard time remembering from which store you can get which data. You can now simply gather stores by topic/storage technology used/etc via initStores().