useStoreMap
Function, which subscribes to a store and transforms its value with a given function. Signal will update only when the selector function result will change
useStoreMap(store, fn)
Common use case: subscribe to changes in selected part of store only
useStoreMap<State, Result>(
store: Store<State>,
fn: (state: State) => Result
): Accessor<Result>
Arguments
store
: Source storefn
((state) => result): Selector function to receive part of source store
Returns
(Result)
useStoreMap(config)
useStoreMap({ store, keys, fn, updateFilter });
Arguments
params
(Object): Configuration objectstore
: Source storekeys
(Array): Will be passed tofn
selectorfn
((state, keys) => result): Selector function to receive part of source storeupdateFilter
((newResult, oldResult) => boolean): Optional function used to compare old and new updates to prevent unnecessary rerenders. Uses createStore updateFilter option under the hood
Returns
(Accessor<Result>)
Example
This hook is very useful for working with lists, especially with large ones
import { createStore } from "effector";
import { useUnit, useStoreMap } from "effector-solid";
import { For } from "solid-js/web";
const data = [
{
id: 1,
name: "Yung",
},
{
id: 2,
name: "Lean",
},
{
id: 3,
name: "Kyoto",
},
{
id: 4,
name: "Sesh",
},
];
const $users = createStore(data);
const $ids = createStore(data.map(({ id }) => id));
const User = ({ id }) => {
const user = useStoreMap({
store: $users,
keys: [id],
fn: (users, [userId]) => users.find(({ id }) => id === userId),
});
return (
<div>
<strong>[{user().id}]</strong> {user().name}
</div>
);
};
const UserList = () => {
const ids = useUnit($ids);
return <For each={ids()}>{(id) => <User key={id} id={id} />}</For>;
};