Плагин передаёт скоуп всему приложению: хуки читают из него сторы и вызывают в нём события. Нужен для SSR.
EffectorScopePlugin появился в effector-vue 23.0.0
Плагины
EffectorScopePlugin({ scope, scopeName, forceScope, live })
Формула
EffectorScopePlugin(options: EffectorScopePluginOptions): Plugin;app.use(EffectorScopePlugin, options: EffectorScopePluginOptions): App;Аргументы
scopeScope, созданный черезforkscopeName?своё имя скоупа (по умолчаниюroot), устаревший строковый ключ инъекцииforceScope?бросить ошибку вместо перехода в глобальный режим, когда хук этого приложения не нашёл скоуп (по умолчаниюfalse)live?подписываются ли хуки на скоуп:falseзаставляет их читать скоуп при обращении без подписки, как при серверном рендере,trueзаставляет подписываться всегда (по умолчаниюfalseвнутриrenderToString,trueв остальных случаях)
Опция forceScope появилась в effector-vue 23.3.0
Опция live появилась в effector-vue 23.3.0
Плагин передаёт скоуп под ключом инъекции EffectorScopeKey и, для обратной совместимости, под строкой scopeName.
EffectorScopeKey появился в effector-vue 23.3.0. С этой же версии плагин бросает ошибку без корректного scope
Импорт
Во Vue 3 импортируйте плагин из effector-vue/composition, рядом с остальными методами Composition API:
import { EffectorScopePlugin, EffectorScopeKey } from "effector-vue/composition";Из effector-vue/composition плагин экспортируется с effector-vue 23.2.0. Корневая точка входа effector-vue тоже экспортирует плагин и продолжит это делать ради обратной совместимости. Это точка входа API для Vue 2 (VueEffector, createComponent), поэтому приложение на Vue 3, которое импортирует из неё, тянет код, который никогда не выполняет.
Примеры
Базовый пример
import { createSSRApp } from "vue";import { EffectorScopePlugin } from "effector-vue/composition";import { fork } from "effector";
const app = createSSRApp(AppComponent);const scope = fork();
app.use( EffectorScopePlugin({ scope, scopeName: "app-scope-name", }),);Опции в app.use
Форма app.use(EffectorScopePlugin, options) работает с effector-vue 23.3.0
Обе формы устанавливают плагин:
app.use(EffectorScopePlugin({ scope }));app.use(EffectorScopePlugin, { scope });Обязательный скоуп
С forceScope хук, который не нашёл скоуп, бросает ошибку, а не читает глобальные сторы:
app.use(EffectorScopePlugin({ scope, forceScope: true }));Опция читается через контекст инъекции, поэтому действует на вызовы, которые видят приложение: setup, app.runWithContext и всё, что вызвано до первого await в асинхронном setup. Вызов, потерявший контекст, не видит ни скоупа, ни опции: передайте ему { forceScope: true } напрямую.
Как выбирается скоуп
Поиск через EffectorScopeKey и опции скоупа у хуков появились в effector-vue 23.3.0. Раньше скоуп читался только по строковому ключу scopeName через экземпляр компонента
Куда передаются опции скоупа, зависит от хука:
| Хук | Опции скоупа |
|---|---|
useUnit(unit, opts) | { scope, forceScope } последним аргументом |
useStore($store, opts) | { scope, forceScope } последним аргументом |
useGate(Gate, props, opts) | { scope, forceScope } последним аргументом |
useStoreMap(config) | scope и forceScope в конфиге; второй позиционный аргумент тоже работает |
useProvidedScope(opts) | только { forceScope } |
useVModel($store, opts) | { scope, forceScope } последним аргументом; Vue EffectScope там тоже работает |
В любой форме скоуп ищется в таком порядке:
- опция
scopeвызова; - значение под ключом
EffectorScopeKey, если у вызова есть контекст инъекции; - устаревший строковый ключ, если доступен экземпляр компонента;
- глобальный режим, если не включён
forceScope.
Строковый ключ читается, только когда под EffectorScopeKey ничего не передано. С установленным плагином поддерево переопределяет скоуп через provide(EffectorScopeKey, scope); значение, переданное под строкой scopeName, этого больше не делает.
Ключ создан через Symbol.for, поэтому скоуп, переданный другой копией пакета, тоже находится. Плагин для этого не нужен, достаточно передать скоуп вручную:
import { provide } from "vue";import { EffectorScopeKey } from "effector-vue/composition";
provide(EffectorScopeKey, scope);Связанные API
- useProvidedScope возвращает найденный скоуп напрямую.
Документация на английском языке - самая актуальная, поскольку её пишет и обновляет команда effector. Перевод документации на другие языки осуществляется сообществом по мере наличия сил и желания.
Помните, что переведенные статьи могут быть неактуальными, поэтому для получения наиболее точной и актуальной информации рекомендуем использовать оригинальную англоязычную версию документации.