Реакт-хук, который подписывается на стор и трансформирует его значение с переданной функцией. Компонент будет обновляться только когда результат функции будет отличаться от предыдущего
Типичный вариант использования: подписаться на изменения отдельного поля в сторе
useStoreMap<State, Result>( store: Store<State>, fn: (state: State) => Result): Result
Краткая форма useStoreMap
добавлена в effector-react@21.3.0
Аргументы
store
: Используемый сторfn
((state) => result): Функция-селектор
Возвращает
(Result)
useStoreMap<Source, Result>({ store: Store<Source>; keys: any[]; fn: (state: Source, keys: any[]) => Result; updateFilter?: (newResult: Result, oldResult: Result) => boolean; defaultValue?: Result;}): Result
Перегрузка для случаев, когда требуется передать зависимости в React (для обновления элементов при изменении этих зависимостей)
Аргументы
params
(Object): Объект конфигурацииstore
: Используемый сторkeys
(Array): Массив, который будет передан в React.useMemofn
((state, keys) => result): Функция-селекторupdateFilter
((newResult, oldResult) => boolean): Опционально функция, используемая для сравнения старого и нового результата работы хука, предназначено для избежания лишних ререндеров. Реализация опции для работы использует createStore updateFilterdefaultValue
: Опциональное значение по умолчанию, используется когдаfn
возвращает undefined
Возвращает
(Result)
Опция updateFilter
добавлена в effector-react@21.3.0
Опция defaultValue
добавлена в effector-react@22.1.0
Пример
Этот хук полезен для работы со списками, особенно с большими
import { createStore } from "effector";import { useUnit, useStoreMap } from "effector-react";
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 ids.map((id) => <User key={id} id={id} />);};
Документация на английском языке - самая актуальная, поскольку её пишет и обновляет команда effector. Перевод документации на другие языки осуществляется сообществом по мере наличия сил и желания.
Помните, что переведенные статьи могут быть неактуальными, поэтому для получения наиболее точной и актуальной информации рекомендуем использовать оригинальную англоязычную версию документации.