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()); // => 0console.log(scopeA.getState($counter)); // => 1console.log(scopeB.getState($counter)); // => -1
fork(options)
Позволяет задать значения для сторов в scope и заменить обработчики для effects.
поддержка массива кортежей в values
и handlers
введена в effector 22.0.0
Формула
fork(options: { values?, handlers? }): Scope
Аргументы
options: { values?, handlers? }
— Объект с необязательными значениями и обработчиками
values
Опция для предоставления начальных состояний для сторов.
Может использоваться тремя способами:
- Массив кортежей со сторами и значениями:
fork({ values: [ [$user, "alice"], [$age, 21], ],});
- Map со сторами и значениями:
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
Примеры
Задание начального состояния для стора и изменение обработчика для 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 },});
/* проверяем значение стора в 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. Перевод документации на другие языки осуществляется сообществом по мере наличия сил и желания.
Помните, что переведенные статьи могут быть неактуальными, поэтому для получения наиболее точной и актуальной информации рекомендуем использовать оригинальную англоязычную версию документации.