Function: useStore()
useStore<
Store
,FilterSelectors
>(store
,filterSelectors
):ProxyStoreTuple
<Store
["__"
]["initialState"
],Store
,Extract
<FilterSelectors
[number
],string
>>
Defined in: lib/use-store.ts:107
useStore
is a custom hook that takes in a store created with StateAdapt.adapt, subscribes to it, and returns a tuple [selectorResults, setState]
where selectorResults
is a proxy object containing results from the store's selectors, and setState
is a function with additional properties assigned from the store object that was passed into useStore
.
When the store's state changes, it will trigger a component re-render, no matter what selectors are being accessed from the proxy. To avoid unnecessary re-renders, you can pass in a list of selector names to only trigger re-renders when those specific selectors change. The selectors are evaluated lazily.
Example: Basic useStore usage
import { adapt } from '../store'; // Import from wherever you configure StateAdapt
import { useStore } from '@state-adapt/react';
const nameStore = adapt('Bob', {
concat: (state, name: string) => state + name,
selectors: {
uppercase: state => state.toUpperCase(),
}
});
export function MyComponent() {
const [name, setName] = useStore(nameStore);
return (
<div>
<h1>Hello {name.uppercase}</h1>
<button onClick={() => setName.concat('!')}>Concat</button>
</div>
);
}
Example: useStore with filter selectors
import { adapt } from '../store'; // Import from wherever you configure StateAdapt
import { useStore } from '@state-adapt/react';
const nameStore = adapt('Bob', {
concat: (state, name: string) => state + name,
selectors: {
uppercase: state => state.toUpperCase(),
}
});
export function MyComponent() {
// Only name.uppercase will trigger re-renders
const [name, setName] = useStore(nameStore, ['uppercase']);
return (
<div>
<h1>Hello {name.uppercase}</h1>
<button onClick={() => setName.concat('!')}>Concat</button>
</div>
);
}
Example: Lazy selector evaluation
import { adapt } from '../store'; // Import from wherever you configure StateAdapt
import { useStore } from '@state-adapt/react';
const counterStore = adapt(0, {
increment: state => state + 1,
decrement: state => state - 1,
selectors: {
isEven: state => state % 2 === 0,
isOdd: state => state % 2 !== 0,
}
});
export function MyComponent() {
const [counter, setCounter] = useStore(counterStore);
// Until the count is greater than 5 and the extra part below renders,
// the isEvent and isOdd selectors will not be evaluated
return (
<div>
<h1>Counter: {counter.state}</h1>
<button onClick={() => setCounter.increment()}>Increment</button>
<button onClick={() => setCounter.decrement()}>Decrement</button>
{counter.state > 5 && (
<h2>Is even: {counter.isEven ? 'Yes' : 'No'}</h2>
<h2>Is odd: {counter.isOdd ? 'Yes' : 'No'}</h2>
)}
</div>
);
}
Type Parameters
Store
Store
extends StoreLike
<any
, any
, any
>
FilterSelectors
FilterSelectors
extends keyof Store
["__"
]["selectors"
][]
Parameters
store
Store
filterSelectors
FilterSelectors
= ...
Returns
ProxyStoreTuple
<Store
["__"
]["initialState"
], Store
, Extract
<FilterSelectors
[number
], string
>>