react-hooks-global-state
    TypeScript icon, indicating that this package has built-in type declarations

    1.0.2 • Public • Published

    react-hooks-global-state

    CI npm size discord

    Simple global state for React with Hooks API without Context API

    Introduction

    This is a library to provide a global state with React Hooks. It has following characteristics.

    • 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.
    • Concurrent Mode support (Experimental)
      • Undocumented useGlobalStateProvider supports CM without React Context.

    Install

    npm install react-hooks-global-state

    Usage

    setState style

    import React from 'react';
    import { createGlobalState } from 'react-hooks-global-state';
    
    const initialState = { count: 0 };
    const { useGlobalState } = createGlobalState(initialState);
    
    const Counter = () => {
      const [count, setCount] = useGlobalState('count');
      return (
        <div>
          <span>Counter: {count}</span>
          {/* update state by passing callback function */}
          <button onClick={() => setCount(v => v + 1)}>+1</button>
          {/* update state by passing new value */}
          <button onClick={() => setCount(count - 1)}>-1</button>
        </div>
      );
    };
    
    const App = () => (
      <>
        <Counter />
        <Counter />
      </>
    );

    reducer style

    import React from 'react';
    import { createStore } from 'react-hooks-global-state';
    
    const reducer = (state, action) => {
      switch (action.type) {
        case 'increment': return { ...state, count: state.count + 1 };
        case 'decrement': return { ...state, count: state.count - 1 };
        default: return state;
      }
    };
    const initialState = { count: 0 };
    const { dispatch, useGlobalState } = createStore(reducer, initialState);
    
    const Counter = () => {
      const [value] = useGlobalState('count');
      return (
        <div>
          <span>Counter: {value}</span>
          <button onClick={() => dispatch({ type: 'increment' })}>+1</button>
          <button onClick={() => dispatch({ type: 'decrement' })}>-1</button>
        </div>
      );
    };
    
    const App = () => (
      <>
        <Counter />
        <Counter />
      </>
    );

    API

    createGlobalState

    create a global state

    It returns a set of functions

    • useGlobalState: a custom hook works like React.useState
    • getGlobalState: a function to get a global state by key outside React
    • setGlobalState: a function to set a global state by key outside React

    Parameters

    • initialState State

    Examples

    import { createGlobalState } from 'react-hooks-global-state';
    
    const { useGlobalState } = createGlobalState({ count: 0 });
    
    const Component = () => {
      const [count, setCount] = useGlobalState('count');
      ...
    };

    createStore

    create a global store

    In additon to useGlobalState which is the same hook as in createGlobalState, a store has getState and dispatch. A store works somewhat similarly to Redux, but not the same.

    Parameters

    • reducer Reducer<State, Action>
    • initialState State (optional, default (reducer as any)(undefined,{type:undefined}))
    • enhancer Enhancer<any>?

    Examples

    import { createStore } from 'react-hooks-global-state';
    
    const initialState = { count: 0 };
    const reducer = ...;
    
    const store = createStore(reducer, initialState);
    const { useGlobalState } = store;
    
    const Component = () => {
      const [count, setCount] = useGlobalState('count');
      ...
    };

    Examples

    The examples folder contains working examples. You can run one of them with

    PORT=8080 npm run examples:01_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

    Blogs

    Community Wiki

    Install

    npm i react-hooks-global-state

    DownloadsWeekly Downloads

    10,076

    Version

    1.0.2

    License

    MIT

    Unpacked Size

    80.2 kB

    Total Files

    20

    Last publish

    Collaborators

    • daishi