Этот метод позволяет получить состояние из каждого переданного сторов и комбинировать их в одно значение, сохраняя в новом производном сторе. Полученный стор будет обновляться каждый раз, как обновляется любой из переданных сторов

Если несколько сторов обновятся одновременно, то метод обработает их всех разом, то есть 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 })

info

Ранее известен как 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. Перевод документации на другие языки осуществляется сообществом по мере наличия сил и желания.

Помните, что переведенные статьи могут быть неактуальными, поэтому для получения наиболее точной и актуальной информации рекомендуем использовать оригинальную англоязычную версию документации.

Соавторы