# useLocalStore

Allows you to create a store to represent the state for an individual React component. This is essentially an alternative to the official useState and useReducer hooks provided by React for component-level state.

function MyCounter() {
  const [state, actions] = useLocalStore(() => ({
    count: 0,
    increment: action((_state) => {
      _state.count += 1;
    }),
  }));

  return (
    <div>
      {state.count}
      <button onClick={() => actions.increment()}>+</button>
    </div>
  );
}

# API

The useLocalStore is a function described below.

# Arguments

  • modelCreater ((prevState?: Object) => Object, required)

    A function that should return the model representing your store.

    The function receives the following arguments:

    • prevState (Object, optional)

      If the store is being recreated (i.e. due to a dependency change), then the previous state will be provided. This allows partial / full state rehydration.

  • dependencies (Array, optional, default=[])

    A list of dependencies, similar to the official React hooks. If any of the values change then the store will be recreated. Especially helpful if your store depends on an external value, such as a prop.

    By default an empty array will be used, meaning the store will not be recreated.

  • storeConfig ((prevState?: Object, prevConfig?: Object) => Object, optional)

    Allows you to customise the configuration options for your store. Please see the StoreConfig API documentation for a full list of configuration options.

    This will get called every time the dependencies array for your store changes.

    useLocalStore(
      () => model,
      [],
      () => ({ middleware: [loggerMiddleware] }),
    );
    

    The function receives the following arguments:

    • prevState (Object, optional)

      If the store is being recreated (i.e. due to a dependency change), then the previous state will be provided. This allows partial / full state rehydration.

    • prevConfig (Object, optional)

      If the store is being recreated (i.e. due to a dependency change), then the previous config will be provided.

# Returns

It returns a positional array as described below;

const [state, actions, store] = useLocalStore(/*...*/);
  • state

    The state of your store.

  • actions

    The actions of your store.

  • store

    The actual store instance - for advanced cases.

# Tutorial

# Creating and using a local store

Utilising the useLocalStore hook is very simple if you are already familiar with the primary APIs of Easy Peasy. It can easily be described via the following concise example.

import { useLocalStore } from 'easy-peasy';

function MyCounter() {
  const [state, actions] = useLocalStore(() => ({
    count: 0,
    inc: action((_state) => {
      _state.count += 1;
    }),
  }));
  return (
    <>
      <div>{state.count}</div>
      <button onClick={() => actions.inc()} type="button">
        {' '}
        +{' '}
      </button>
    </>
  );
}

# Reinitialising your model based on incoming props

There may be cases in which you may want to reinitialize your store based on some incoming props. The store hook will only initialize once for each use. To get around this simply define the dependency array, providing a list of props, that when they change will cause the store to be recreated.

import { useLocalStore, action } from 'easy-peasy';

function EditProduct({ product }) {
  const [state, actions] = useLocalStore(
    () => ({
      product, // 👈 using state to initialize model
      setPrice: action((_state, payload) => {
        _state.product.price = payload;
      }),
    }),
    [product], // 👈 recreate model every time we receive a different product
  );

  return (
    <>
      <div>{state.product.name}</div>
      <input
        onChange={(e) => actions.setPrice(e.target.value)}
        value={state.product.price}
      />
    </>
  );
}