Manual Updates
Sometimes you may want to manually update query data rather than trigger an async query to fetch data. You can use setValue
to update query data. You can use setValue
inside or outside of a React component. This is most commonly used to implement optimitic updates.
Usage
Set value in a useEffect
typescript
const useDogStore = create<DogState>(() => ({
increasePopulation: effect(increasePopulation),
removeAllDogs: effect(removeAllDogs),
dogs: query(fetchDogs, s => [s.increasePopulation, s.removeAllDogs])
}));
const useDogStoreAsync = hook(useDogStore);
const MyComponent = () => {
useEffect(() => {
useDogStore.getState().dogs.setValue(100):
}, []);
};
Set value outside of react
typescript
const useDogStore = create<DogState>(() => ({
increasePopulation: effect(increasePopulation),
removeAllDogs: effect(removeAllDogs),
dogs: query(fetchDogs, s => [s.increasePopulation, s.removeAllDogs])
}));
useDogStore.getState().dogs.setValue(100);
Batch updates
You can batch updates manually. When you batch use Zustand's built-in set
or setState
functions to update the store. Use withValue
rather than setValue
to get an updated query with out updating the store.
typescript
const useDogStore = create<DogState>(() => ({
smallDogs: query(fetchSmallDogs, s => [s.increasePopulation, s.removeAllDogs]),
largeDogs: query(fetchLargeDogs, s => [s.increasePopulation, s.removeAllDogs]),
increasePopulation: effect(increasePopulation),
removeAllDogs: effect(removeAllDogs),
}));
useDogStore.setState(state => {
return {
dogs: state.dogs.withValue(100),
cats: state.cats.withValue(100),
};
})