This library provides a robust and flexible state management solution for JavaScript and TypeScript applications, with a focus on React integration. It includes a powerful Store class, custom hooks for React, and an AsyncAction utility for handling asynchronous operations.
- De-centralized state management with subscriptions
- Efficient state updates with shallow comparison
- React hooks for easy integration (
useStore
anduseStoreSelector
) - Asynchronous action handling with status tracking and cancelation
- TypeScript support for type-safe state management
npm install store2state
import { createStore } from 'store2state';
const initialState = { count: 0 };
const store = createStore(initialState);
import { useStore } from 'storee2state';
function Counter() {
const { get, set } = useStore(store);
return (
<div>
<p>Count: {get().count}</p>
<button onClick={() => set(state => ({ count: state.count + 1 }))}>
Increment
</button>
</div>
);
}
import { useStoreSelector } from 'store2state';
function CountDisplay() {
const count = useStoreSelector(store, state => state.count);
return <p>Count: {count}</p>;
}
import { createAsyncAction, Status } from 'store2state';
const fetchUserAction = createAsyncAction(store, async (store, setStatus, userId) => {
setStatus(Status.LOADING);
try {
const response = await fetch(`/api/users/${userId}`);
const user = await response.json();
setStatus(Status.SUCCESS, user);
return user;
} catch (error) {
setStatus(Status.ERROR, error);
throw error;
}
});
// Using the async action
fetchUserAction.call(123)
.then(user => console.log(user))
.catch(error => console.error(error));
// Checking the status
console.log(fetchUserAction.isLoading);
The main class for state management.
get()
: Get the current stateset(newValue: SetterFunc<State>)
: Update the statesubscribe(eventName: string, subscriber: Subscriber<State>)
: Subscribe to state changesunsubscribe(eventName: string, id: string)
: Unsubscribe from state changesdispatch(eventName: string)
: Dispatch an event to subscribers
useStore<State>(store: Store<State>)
: Hook for using the store in React componentsuseStoreSelector<State, Selected>(store: Store<State>, selector: (state: State) => Selected)
: Hook for selecting specific parts of the state
Utility for handling asynchronous operations with status tracking.
call(...args: Args)
: Execute the async actioncancel()
: Cancel the ongoing async actiononError(effect: AsyncActionEffect<State, ErrorPayload>)
: Add an error effectonSuccess(effect: AsyncActionEffect<State, SuccessPayload>)
: Add a success effectonLoading(effect: AsyncActionEffect<State, void>)
: Add a loading effect
store2state
is licensed under the MIT License. See the LICENSE file for details.
- Completely decouple the library with react integration and use separate npm library to provide support to various different frameworks.
Contributions are welcome! Please feel free to submit a Pull Request.