auto-zustand-selectors-hook
TypeScript icon, indicating that this package has built-in type declarations

2.0.0 • Public • Published

auto-zustand-selectors-hook

Enjoy the performance gain of selectors without writing selectors!

Features

  • auto generate selectors for Zustand store (be it a value or a function)
  • Two styles available
  • Fully Typescript support (auto-completion for the generated selectors!)

Install

npm install --save auto-zustand-selectors-hook

Or with yarn:

yarn add auto-zustand-selectors-hook

Notice

The v2 supports Zustand v4, if you are using a Zustand v3, please install the v1 version

yarn add auto-zustand-selectors-hook@1.0.1

npm install --save auto-zustand-selectors-hook@1.0.1

Usage

Let's say you have a store like this

interface BearState {
  bears: number;
  increase: (by: number) => void;
}

const useStoreBase = create<BearState>((set) => ({
  bears: 0,
  increase: (by) => set((state) => ({ bears: state.bears + by })),
}));

There are two types of selectors you can generate, purely function signature difference, underneath, they are all selectors.

1. For function style ( createSelectorFunctions )

import { createSelectorFunctions } from 'auto-zustand-selectors-hook';
import { create } from 'zustand';

// wrap your store
const useStore = createSelectorFunctions(useStoreBase);

// use it like this!
// useStore.use.blah is a pre-generated selector, yeah!
const TestComponent = () => {
  const bears = useStore.use.bears();
  const increase = useStore.use.increase();

  return (
    <>
      <span>{bears}</span>

      <button
        onClick={() => {
          increase(1);
        }}
      >
        +
      </button>
    </>
  );
};

2. For hook style ( createSelectorHooks )

import { createSelectorHooks } from 'auto-zustand-selectors-hook';
import { create } from 'zustand';

// wrap your store
const useStore = createSelectorHooks(useStoreBase);

// use it like this!
// useStore.useBlah is a pre-generated selector, yeah!
const TestComponent = () => {
  const bears = useStore.useBears();
  const increase = useStore.useIncrease();

  return (
    <>
      <span>{bears}</span>

      <button
        onClick={() => {
          increase(1);
        }}
      >
        +
      </button>
    </>
  );
};

3. use with middlewares

You use the middleware for creating the base store, and ALWAYS use auto-zustand-selectors-hooks as a separate wrapper

import { createSelectorHooks } from '../src/index';
import create from 'zustand';
import { persist } from 'zustand/middleware';

const useStoreBase = create<BearState>()(
  persist((set) => ({
    bears: 0,
    increase: (by) => set((state) => ({ bears: state.bears + by })),
  }))
);

export const useStore = createSelectorHooks(useStoreBase);

License

MIT © Albert Gao

Credits

It all starts from my feature request Thanks dai-shi for the initial implementation and ideas of API.

Versions

Current Tags

  • Version
    Downloads (Last 7 Days)
    • Tag
  • 2.0.0
    3,603
    • latest

Version History

  • Version
    Downloads (Last 7 Days)
    • Published
  • 2.0.0
    3,603
  • 1.0.1
    1,466
  • 1.0.0
    2

Package Sidebar

Install

npm i auto-zustand-selectors-hook

Weekly Downloads

5,071

Version

2.0.0

License

MIT

Unpacked Size

20.8 kB

Total Files

19

Last publish

Collaborators

  • albertgao