import { useStoreMap } from "effector-vue/composition";

Function, which subscribes to store and transforms its value with a given function. Signal will update only when the selector function result will change

Methods

useStoreMap($store, fn)

Formulae

useStoreMap(
$store: Store<State>,
fn: (state: State) => Result,
): ComputedRef<Result>;

Arguments

  1. $store: Source Store<State>
  2. fn ((state) => result): Selector function to receive part of source store

Returns

(ComputedRef<Result>)

useStoreMap(config)

Formulae

useStoreMap({
store: Store<State>,
keys?: () => Keys,
fn: (state: State, keys: Keys) => Result,
defaultValue?: Result,
}): ComputedRef<Result>;

Arguments

  1. params (Object): Configuration object
    • store: Source store
    • keys (() => Keys): Will be passed to fn selector
    • fn ((state: State, keys: Keys) => Result): Selector function to receive part of source store
    • defaultValue (Result): Optional default value if fn returned undefined

Returns

(ComputedRef<Result>)

Examples

This hook is very useful for working with lists, especially with large ones

User.vue
import { createStore } from "effector";
import { useUnit, useStoreMap } from "effector-vue/composition";
const $users = createStore([
{
id: 1,
name: "Yung",
},
{
id: 2,
name: "Lean",
},
{
id: 3,
name: "Kyoto",
},
{
id: 4,
name: "Sesh",
},
]);
export default {
props: {
id: Number,
},
setup(props) {
const user = useStoreMap({
store: $users,
keys: () => props.id,
fn: (users, userId) => users.find(({ id }) => id === userId),
});
return { user };
},
};
<div>
<strong>[{user.id}]</strong> {user.name}
</div>
App.vue
const $ids = createStore(data.map(({ id }) => id));
export default {
setup() {
const ids = useStore($ids);
return { ids };
},
};
<div>
<User v-for="id in ids" :key="id" :id="id" />
</div>
Contributors