Этот метод позволяет получить состояние из каждого переданного сторов и комбинировать их в одно значение, сохраняя в новом производном сторе. Полученный стор будет обновляться каждый раз, как обновляется любой из переданных сторов
Если несколько сторов обновятся одновременно, то метод обработает их всех разом, то есть combine
батчит обновления, что приводит к более эффективной работе без излишних вычислений
combine
возвращает не просто обычный стор, он возвращает DerivedStore, который нельзя изменять через события или использовать в качестве target
в sample.
Общая формула
declare const $a: Store<A>;
declare const $b: Store<B>;
// Трансформация состояний
const $c: Store<C> = combine({ a: $a, b: $b }, (values: { a: A; b: B }) => C);
const $c: Store<C> = combine([$a, $b], (values: [A, B]) => C);
const $c: Store<C> = combine($a, $b, (a: A, b: B) => C);
// Комбинирование состояний
const $c: Store<{ a: A; b: B }> = combine({ a: $a, b: $b });
const $c: Store<[A, B]> = combine([$a, $b]);
Преобразование состояния
Когда в combine
передается функция, она будет действовать как функция трансформации состояния и вызываться при каждом обновлении combine
.
Результат будет сохранен в созданном сторе. Эта функция должна быть чистой.
Функция combine
вызывается синхронно во время вызова combine
. Если эта функция вызовет ошибку, приложение завершится сбоем. Это будет исправлено в 24 релизе.
combine(...stores, fn)
Формула
const $a: Store<A>
const $b: StoreWritable<B>
const $c: Store<C> | StoreWritable<C>
$result: Store<D> = combine(
$a, $b, $c, ...,
(a: A, b: B, c: C, ...) => result
)
- После вызова
combine
состояние каждого стора извлекается и передается в качестве аргументов функции, результат вызова функции станет состоянием стора$result
. - В
combine
можно передавать любое количество сторов, но последним аргументом всегда должна быть функция-редуктор, возвращающая новое состояние. - Если функция вернула то же значение
result
, что и предыдущее, стор$result
не будет обновлен. - Если несколько сторов обновляются одновременно (за один тик), будет единый вызов функции и единое обновление стора
$result
. - Функция должна быть чистой.
Возвращает
DerivedStore: Новый производный стор.
Примеры
combine({ A, B, C }, fn)
Формула
const $a: Store<A>;
const $b: StoreWritable<B>;
const $c: Store<C> | StoreWritable<C>;
$result: Store<D> = combine(
{ a: $a, b: $b, c: $c },
({ a, b, c }: { a: A; b: B; c: C }): D => result,
);
- Читает состояние из сторов
$a
,$b
,$c
и присваивает его соответствующим полямa
,b
,c
, затем вызывает функцию с этим объектом. - Результат вызова функции сохраняется в сторе
$result
. - Если функция вернула то же значение
result
, что и предыдущее, стор$result
не будет обновлен. - Если несколько сторов обновляются одновременно (за один тик), будет единый вызов функции и единое обновление стора
$result
. - Функция должна быть чистой.
Возвращает
DerivedStore: Новый производный стор.
Примеры
combine([ A, B, C ], fn)
Формула
const $a: Store<A>;
const $b: StoreWritable<B>;
const $c: Store<C> | StoreWritable<C>;
$result: Store<D> = combine([$a, $b, $c], ([A, B, C]): D => result);
- Читает состояние из сторов
$a
,$b
,$c
и присваивает его массиву в том порядке, в котором сторы были переданы, затем вызывает функцию с этим массивом. - Результат вызова функции сохраняется в сторе
$result
. - Если функция вернула то же значение
result
, что и предыдущее, стор$result
не будет обновлен. - Если несколько сторов обновляются одновременно (за один тик), будет единый вызов функции и единое обновление стора
$result
. - Функция должна быть чистой.
Возвращает
DerivedStore: Новый производный стор.
Примеры
Комбинирование состояний
Когда в combine
не передается функция, он действует как комбинатор состояний, создавая стор с массивом или объектом, содержащим поля переданных сторов.
combine({ A, B, C })
Ранее известен как createStoreObject
.
Формула
const $a: Store<A>;
const $b: StoreWritable<B>;
const $c: Store<C> | StoreWritable<C>;
$result: Store<{ a: A; b: B; c: C }> = combine({ a: $a, b: $b, c: $c });
- Читает состояние из сторов
$a
,$b
,$c
и присваивает его соответствующим полямa
,b
,c
, этот объект сохраняется в сторе$result
. - Стор
$result
содержит объект{a, b, c}
и будет обновляться при каждом обновлении переданных сторов. - Если несколько сторов обновляются одновременно (за один тик), будет единое обновление стора
$result
.
Возвращает
DerivedStore: Новый производный стор.
Примеры
combine([ A, B, C ])
Формула
const $a: Store<A>;
const $b: StoreWritable<B>;
const $c: Store<C> | StoreWritable<C>;
$result: Store<[A, B, C]> = combine([$a, $b, $c]);
- Читает состояние из сторов
$a
,$b
,$c
и присваивает его массиву в том порядке, в котором сторы были переданы, этот массив сохраняется в сторе$result
. - Стор
$result
будет обновляться при каждом обновлении переданных сторов. - Если несколько сторов обновляются одновременно (за один тик), будет единое обновление стора
$result
.
Возвращает
DerivedStore: Новый производный стор.
Примеры
combine
с примитивами и объектами
Примитивы и объекты могут использоваться в combine
, и combine
не будет реагировать на их
изменения. Effector не отслеживает мутации объектов и примитивов.
Примеры
Параметры
Все перегрузки combine
с функцией поддерживают опциональный объект конфигурации в качестве последнего параметра.
.skipVoid
Флаг для контроля обработки значений undefined
в сторе (начиная с версии effector 23.0.0
). Если установить в false
, стор будет использовать undefined
как значение. Если установить в true
(устарело), стор будет интерпретировать undefined
как команду «пропустить обновление» и ничего не делать.
Формула
combine($a, $b, callback, { skipVoid: true });
- Тип:
boolean
Примеры
const $withFn = combine($a, $b, (a, b) => a || b, { skipVoid: false });
Документация на английском языке - самая актуальная, поскольку её пишет и обновляет команда effector. Перевод документации на другие языки осуществляется сообществом по мере наличия сил и желания.
Помните, что переведенные статьи могут быть неактуальными, поэтому для получения наиболее точной и актуальной информации рекомендуем использовать оригинальную англоязычную версию документации.