Zustand is a great React state management library, but it has the drawback of not having a standard way to define getters, which must be defined as ordinary hooks.
Written by the same author, Jotai seems to be the answer to this situation. However, while Zustand provides a way to change the state outside React components, Jotai does not. Today I was able to devise a way to work around this, by simply applying the hooks concept, answering my own question:
const errorAtom = atom(''); // storage
const errorReadAtom = atom(get => { // read-only (computed)
return 'Error: ' + get(errorAtom);
});
const writeErrorAtom = atom(null, (get, set, arg: string): void => { // setter
set(errorAtom, arg);
});
function useGet(): (url: string) => Promise {
const [, setError] = useAtom(errorAtom);
return async (url: string): Promise => {
const resp = await fetch(url);
const json = await resp.json();
setError('Hello');
return json as T;
};
}
Usage:
function App() {
const doGet = useGet();
async function click(): void {
const data = await doGet('/foo');
}
return <button onClick={click}>Click</button>;
}
So, with Jotai I finally have the complete solution to state management in React.