import { fork, type Scope } from "effector";
Методы
fork()
введен в effector 22.0.0
Создает изолированный экземпляр приложения. Основные цели этого метода — SSR и тестирование.
Формула
fork(): Scope
Возвращает
Scope: Новый чистый scope
Примеры
Создание двух экземпляров с независимым состоянием счетчика
import { createStore, createEvent, fork, allSettled } from "effector";
const inc = createEvent();
const dec = createEvent();
const $counter = createStore(0);
$counter.on(inc, (value) => value + 1);
$counter.on(dec, (value) => value - 1);
const scopeA = fork();
const scopeB = fork();
await allSettled(inc, { scope: scopeA });
await allSettled(dec, { scope: scopeB });
console.log($counter.getState()); // => 0
console.log(scopeA.getState($counter)); // => 1
console.log(scopeB.getState($counter)); // => -1
fork(options)
Позволяет задать значения для stores в scope и заменить обработчики для effects.
поддержка массива кортежей в values
и handlers
введена в effector 22.0.0
Формула
fork(options: { values?, handlers? }): Scope
Аргументы
options: { values?, handlers? }
— Объект с необязательными значениями и обработчиками
values
Опция для предоставления начальных состояний для stores.
Может использоваться тремя способами:
- Массив кортежей со stores и значениями:
fork({
values: [
[$user, "alice"],
[$age, 21],
],
});
- Map со stores и значениями:
fork({
values: new Map().set($user, "alice").set($age, 21),
});
- Обычный объект:
{[sid: string]: value}
fork({
values: {
[$user.sid]: "alice",
[$age.sid]: 21,
},
});
Такие объекты создаются с помощью serialize, в коде приложения предпочтителен массив кортежей
handlers
Опция для предоставления обработчиков для effects.
Может использоваться по-разному:
- Массив кортежей с effects и обработчиками:
fork({
handlers: [
[getMessageFx, (params) => ({ id: 0, text: "message" })],
[getUserFx, async (params) => ({ name: "alice", age: 21 })],
],
});
- Map с effects и обработчиками:
fork({
handlers: new Map()
.set(getMessageFx, (params) => ({ id: 0, text: "message" }))
.set(getUserFx, async (params) => ({ name: "alice", age: 21 })),
});
- Обычный объект:
{[sid: string]: handler}
fork({
handlers: {
[getMessageFx.sid]: (params) => ({ id: 0, text: "message" }),
[getUserFx.sid]: async (params) => ({ name: "alice", age: 21 }),
},
});
Такие объекты устарели с effector 23.0.0 и будут удалены в будущих версиях. Предпочтителен массив кортежей.
Возвращает
Scope: Новый чистый scope
Примеры
Задание начального состояния для store и изменение обработчика для effect
Это пример теста, который проверяет, что после запроса к серверу значение $friends
заполняется.
import { createEffect, createStore, fork, allSettled } from "effector";
const fetchFriendsFx = createEffect<{ limit: number }, string[]>(async ({ limit }) => {
/* получение данных на стороне клиента */
return [];
});
const $user = createStore("guest");
const $friends = createStore([]);
$friends.on(fetchFriendsFx.doneData, (_, result) => result);
const testScope = fork({
values: [[$user, "alice"]],
handlers: [[fetchFriendsFx, () => ["bob", "carol"]]],
});
/* запускаем вычисления в scope и ожидаем завершения всех вызванных effects */
await allSettled(fetchFriendsFx, {
scope: testScope,
params: { limit: 10 },
});
/* проверяем значение store в scope */
console.log(testScope.getState($friends));
// => ['bob', 'carol']
fork(domain, options?)
Введен в effector 21.0.0
fork
больше не требует domain
в качестве аргумента, так как с effector 22.0.0 он может автоматически отслеживать все юниты.
Формула
fork(domain: Domain, options?: { values?, handlers? }): Scope
Аргументы
domain
(Domain): Необязательный domain для fork.options: { values?, handlers? }
— Объект с необязательными values и handlers
Возвращает
Scope: Новый чистый scope
Примеры
TBD
Документация на английском языке - самая актуальная, поскольку её пишет и обновляет команда effector. Перевод документации на другие языки осуществляется сообществом по мере наличия сил и желания.
Помните, что переведенные статьи могут быть неактуальными, поэтому для получения наиболее точной и актуальной информации рекомендуем использовать оригинальную англоязычную версию документации.