Skip to content

๐Ÿš‰ Easy to use state and actions for React. Optimized rerenders with state selection. Typesafe. Async actions. https://puema.github.io/react-station/

Notifications You must be signed in to change notification settings

puema/react-station

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

50 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

station

React Station - State & Action

Easy to Use โ€ข Hooks โ€ข State Selection โ€ข Optimized Rerenders โ€ข Typesafe โ€ข Async Support
Demo

npm version npm downloads gzip size code style: prettier

Why

๐Ÿ˜Ž Easy to use
๐Ÿฆถ Small footprint
๐Ÿš€ Performance optimized
โ›‘ Typesafe with TypeScript

Redux was always too verbose for my personal taste. React Contex is great, but there is no optimized state subscribtion. I do like the approach of unistore with the bound actions a lot. However I prefer Hooks over the connect() API and I wanted the actions to be part of the store. So I created react-station, a simple state management with a lot of parallels to unistore and useSelect() from redux.

Usage

const initialState = {
  count: 0,
};

type State = typeof initialState;

const actions = {
  // The Current state is passed as first parameter to the actions
  increment({ count }: State) {
    // The return value should be a Partial<State> and will be merged
    return { count: count + 1 };
  },

  // Payload is available as following parameters
  add({ count }: State, value: number) {
    return {
      count: count + value,
    };
  },

  // Actions can also be async
  async calculateSum({ count }: State, value: number) {
    const result = await asyncCalculation(count, value);
    // Make sure to access state after async calls via
    // store.getState() to avoid race conditions
    return {
      count: result,
    };
  },
};

// Multiple instances of different stores can be created
const store = createStore(initialState, actions);

export const Component = () => {
  // Simply retrieve state and actions via hooks
  const { state, actions } = useStore(store);
  // Or select a part of the state to avoid unnecessary rerenders
  const { state: state2 } = useStore(store, s => s.count);

  const { add } = actions;

  add(1); // ok
  add('1'); // Error: '1' is not assignable to parameter of type 'number'.
};

About

๐Ÿš‰ Easy to use state and actions for React. Optimized rerenders with state selection. Typesafe. Async actions. https://puema.github.io/react-station/

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published