Simple global state for React with Hooks API
If you ever try to implement a global state with Context and Hooks, you probably find it straightforward. This library provide more or less the same functionality with some following bonuses.
- Optimization for shallow state getter and setter.
- The library cares the state object only one-level deep.
- TypeScript type definitions
- A creator function creates hooks with types inferred.
- Redux middleware support to some extent
- Some of libraries in Redux ecosystem can be used.
- Redux DevTools Extension could be used in a simple scenario.
Due to the fact that this library utilizes unstable_observedBits
for optimization, this library is still in alpha.
npm install react-hooks-global-state
import React from 'react';
import { createGlobalState } from 'react-hooks-global-state';
const initialState = { counter: 0 };
const { GlobalStateProvider, useGlobalState } = createGlobalState(initialState);
const Counter = () => {
const [value, update] = useGlobalState('counter');
return (
<div>
<span>Counter: {value}</span>
<button onClick={() => update(v => v + 1)}>+1</button>
<button onClick={() => update(v => v - 1)}>-1</button>
</div>
);
};
const App = () => (
<GlobalStateProvider>
<Counter />
<Counter />
</GlobalStateProvider>
);
import React from 'react';
import { createStore } from 'react-hooks-global-state';
const reducer = (state, action) => {
switch (action.type) {
case 'increment': return { ...state, counter: state.counter + 1 };
case 'decrement': return { ...state, counter: state.counter - 1 };
default: return state;
}
};
const initialState = { counter: 0 };
const { GlobalStateProvider, dispatch, useGlobalState } = createStore(reducer, initialState);
const Counter = () => {
const [value] = useGlobalState('counter');
return (
<div>
<span>Counter: {value}</span>
<button onClick={() => dispatch({ type: 'increment' })}>+1</button>
<button onClick={() => dispatch({ type: 'decrement' })}>-1</button>
</div>
);
};
const App = () => (
<GlobalStateProvider>
<Counter />
<Counter />
</GlobalStateProvider>
);
The examples folder contains working examples. You can run one of them with
PORT=8080 npm run examples:minimal
and open http://localhost:8080 in your web browser.
You can also try them in codesandbox.io: 01 02 03 04 05 06 07 08 09 10 11 12 13
- Due to the implementation relying on
observedBits
in the Context API, the performance may drop down if a state holds more than 31 items. Reference: #1
- TypeScript-aware React hooks for global state
- An alternative to React Redux by React Hooks API (For both JavaScript and TypeScript)
- Redux middleware compatible React Hooks library for easy global state management
- React Hooks Tutorial on pure useReducer + useContext for global state like Redux and comparison with react-hooks-global-state
- Four patterns for global state with React hooks: Context or Redux