To provide custom update functions (like increment or decrement) within your state, store them in the state object returned by useValue. You must use useCallback and useMemo to ensure the state object remains stable.
Note: Using custom update functions prevents the benefits of concurrentMode in createContainer.
const useValue = () => {
const [count, setCount] = useState(0);
const increment = useCallback(() => setCount((c) => c + 1), []);
const decrement = useCallback(() => setCount((c) => c - 1), []);
const state = useMemo(
() => ({ count, increment, decrement }),
[count, increment, decrement],
);
return [
state,
() => {
throw new Error('use functions in the state');
},
];
};
const { Provider, useTrackedState } = createContainer(useValue);
const App = () => <Provider>...</Provider>;
const useValue = () => {
const [count, setCount] = useState(0);
const increment = useCallback(() => setCount((c) => c + 1), []);
const decrement = useCallback(() => setCount((c) => c - 1), []);
const state = useMemo(
() => ({
count,
increment,
decrement,
}),
[count, increment, decrement],
);
return [
state,
() => {
throw new Error('use functions in the state');
},
];
};
const { Provider, useTrackedState } = createContainer(useValue);
const App = () => <Provider>...</Provider>;