Этот метод позволяет получить состояние из каждого переданного сторов и комбинировать их в одно значение, сохраняя в новом производном сторе. Полученный стор будет обновляться каждый раз, как обновляется любой из переданных сторов
Если несколько сторов обновятся одновременно, то метод обработает их всех разом, то есть combine
батчит обновления, что приводит к более эффективной работе без излишних вычислений
Общая формула
declare const a: Store<A>;
declare const b: Store<B>;
$c = combine({ a, b }) > Store<{ a: A; b: B }>;
$c = combine([a, b]) > Store<[A, B]>;
$c = combine({ a, b }, (values: { a: A; b: B }) => C) > Store<C>;
$c = combine([a, b], (values: [A, B]) => C) > Store<C>;
$c = combine(a, b, (a: A, b: B) => C) > Store<C>;
Сочетание состояний
combine( { a, b } )
Комбинирует объект сторов в стор с объектом значений
Формула
declare const a: Store<A>;
declare const b: Store<B>;
$c = combine(/*shape*/ { a, b }) > Store<{ a: A; b: B }>;
Аргументы
shape
: Объект сторовОбновление любого из сторов означает изменение значения соответствующего поля в производном сторе
Количество сторов не ограничено
Возвращает
Новый, производный стор
combine( [ a, b ] )
Комбинирует массив сторов в стор с массивом значений
Формула
declare const a: Store<A>;
declare const b: Store<B>;
$c = combine(/*shape*/ [a, b]) > Store<[A, B]>;
Аргументы
shape
: Массив сторовОбновление любого из сторов означает изменение значения соответствующего элемента в производном сторе,
количество сторов не ограничено
Возвращает
Новый, производный стор
Трансформация состояний
combine( { a, b }, ({ a, b }) => result )
Трансформирует объект сторов через функцию, принимающую объект значений
Формула
declare const a: Store<A>;
declare const b: Store<B>;
$c = combine(/*shape*/ { a, b }, /*fn*/ (values: { a: A; b: B }) => C) > Store<C>;
Аргументы
shape
: Объект сторов. Количество сторов не ограниченоfn
:(values: {a: A; b: B}) => C
Функция-обработчик
Преобразует данные перед отправлением в производный стор,
должна быть чистойАргументы
values
: Объект значений
Возвращает: Новое значение для хранения в производном сторе
Если функция возвращает undefined или текущее состояние производного стора, то обновления не будет
Возвращает
Новый, производный стор
combine( [ a, b ], ([ a, b ]) => result )
Трансформирует массив сторов через функцию, принимающую массив значений
Формула
declare const a: Store<A>;
declare const b: Store<B>;
$c = combine(/*stores*/ [a, b], /*fn*/ (values: [A, B]) => C) > Store<C>;
Аргументы
stores
: Массив сторов
Количество используемых сторов не ограниченоfn
:(values: [A, B]) => C
Функция-обработчик
Преобразует данные перед отправлением в производный стор,
должна быть чистойАргументы
values
: Массив значений
Возвращает: Новое значение для хранения в производном сторе
Если функция возвращает undefined или текущее состояние производного стора, то обновления не будет
Возвращает
Новый, производный стор
combine( a, b, ( a, b ) => result )
Трансформирует произвольное число сторов через функцию, принимающую соответствующее число значений в аргументах
Формула
declare const a: Store<A>;
declare const b: Store<B>;
$c = combine(/*...stores*/ a, b, /*fn*/ (a: A, b: B) => C) > Store<C>;
Аргументы
...stores
: Аргументы со сторами, по одному стору на аргумент
В типах максимальное количество используемых сторов - 12, при превышении числа рекомендуется использовать вариант с массивомfn
:(...values: [A, B]) => C
Функция-обработчик
Преобразует данные перед отправлением в производный стор,
число аргументов зависит от числа переданных сторов.
Должна быть чистойАргументы
values
: Аргументы со значениями, по одному аргументу от каждого стора
Возвращает: Новое значение для хранения в производном сторе
Если функция возвращает undefined или текущее состояние производного стора, то обновления не будет
Возвращает
Новый, производный стор
Примеры
Пример
import { createStore, combine } from "effector";
const balance = createStore(0);
const username = createStore("zerobias");
const greeting = combine(balance, username, (balance, username) => {
return `Hello, ${username}. Your balance is ${balance}`;
});
greeting.watch((data) => console.log(data)); // => Hello, zerobias. Your balance is 0
const arrStores = combine([balance, username]);
arrStores.watch(console.log); // => [0, 'zerobias']
Пример
import { createStore, combine } from "effector";
const r = createStore(255);
const g = createStore(0);
const b = createStore(255);
const color = combine({ r, g, b });
color.watch(console.log); // => {r: 255, b: 0, b: 255}
const sum = combine({ r, g, b }, ({ r, g, b }) => r + g + b);
sum.watch(console.log); // => 510
Пример
import { createStore, combine } from "effector";
const r = createStore(255);
const g = createStore(0);
const b = createStore(255);
const color = combine([r, g, b]);
color.watch(console.log);
// => [255, 0, 255]
const sum = combine([r, g, b], ([r, g, b]) => r + g + b);
sum.watch(console.log);
// => 510
combine
с примитивами и объектами
В combine
можно передавать не только сторы, но и примитивы и объекты, и при этом сигнатура метода остается прежней. Однако effector не будет отслеживать изменения этих типов данных, поэтому combine
не будет вызван при их изменении.
Пример
const $a = createStore("a");
const b = 2;
const c = [false];
const d = { value: 1 };
const $resultUsingComa = combine($a, b, c, d);
const $resultUsingArray = combine([$a, b, c, d]);
const $resultUsingObject = combine({ $a, b, c, d });
const $withFn = combine($a, b, c, d, (a, b) => ({ a, b }));
$resultUsingComa.watch(console.log);
// => ["a", 2, [false], {value: 1}]
$resultUsingArray.watch(console.log);
// => ["a", 2, [false], {value: 1}]
$resultUsingObject.watch(console.log);
// => {$a: "a", b: 2, c: [false], d: {value: 1}}
$withFn.watch(console.log);
// => {$a: "a", b: 2}
// Раскомментируйте код ниже, чтобы увидеть изменения
// c.push(true)
// d.value = 2
Документация на английском языке - самая актуальная, поскольку её пишет и обновляет команда effector. Перевод документации на другие языки осуществляется сообществом по мере наличия сил и желания.
Помните, что переведенные статьи могут быть неактуальными, поэтому для получения наиболее точной и актуальной информации рекомендуем использовать оригинальную англоязычную версию документации.