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),
};
})