import { useGate } from "effector-vue/composition";useGate появился в effector-vue 21.1.0
Методы
useGate(Gate, props?, options?)
Открывает Gate на время жизни компонента или effect scope, где вызван хук, и синхронизирует Gate.state с props. Для Vue 3.
Формула
useGate(Gate: Gate<Props>, props?: MaybeRefOrGetter<Props>, options?: ScopeOptions): void;Аргументы
Gate<Props>(Gate)props?(MaybeRefOrGetter<Props>): значение, ref или геттер. Ref, геттер и объектreactive()держатGate.stateв синхронизации. Нереактивное значение читается, когда гейт открывается и когда закрывается.options?(Object):{ scope, forceScope }, см. EffectorScopePlugin. События гейтаopen,closeиsetвызываются в найденном скоупе.
Аргумент options появился в effector-vue 23.3.0
props принимает значение или ref с effector-vue 23.3.0. Раньше он принимал только геттер
События гейта вызываются в найденном скоупе с effector-vue 23.3.0. Раньше они вызывались вне скоупа плагина
Возвращает
(void)
Время жизни
- В компоненте гейт открывается при монтировании и закрывается при размонтировании. Деактивация в
<KeepAlive>оставляет гейт открытым, закрывает его только размонтирование. - Вне компонента гейт открывается сразу и закрывается, когда останавливают окружающий effect scope, например
effectScope(). - Без активного effect scope закрыть гейт некому, поэтому вызов выводит предупреждение и оставляет гейт открытым.
app.runWithContext()даёт контекст инъекции без effect scope, поэтому запускайте его внутриeffectScope().
Закрытие вместе с effect scope появилось в effector-vue 23.3.0. Раньше гейт работал только внутри компонента
Порядок событий
open вызывается раньше set с effector-vue 23.3.0. Раньше первым срабатывал set, пока гейт был закрыт
Первым вызывается open с текущими пропсами, и гейт сам передаёт их в set. Последующие изменения пропсов приходят в set после этого. Пока гейт закрыт, Gate.state не пишется, а монтирование вызывает set один раз:
import { sample } from "effector";import { PageGate, loadPageFx } from "./model";
sample({ clock: PageGate.open, target: loadPageFx }); // получает пропсы монтированияСерверный рендеринг
При серверном рендере гейт остаётся закрытым: на сервере ничего не размонтируется, поэтому открытый там гейт никогда бы не закрылся, а его состояние сериализовалось бы на клиент. Данные страницы загружайте в onServerPrefetch, а гейт используйте на клиенте. Так же работает useGate из effector-react.
С effector-vue 23.3.0 при серверном рендере не вызывается и set. Раньше пропсы попадали в Gate.state на сервере
Примеры
<script setup lang="ts">import { useGate } from "effector-vue/composition";import { PageGate } from "./model";
const props = defineProps<{ id: string }>();
useGate(PageGate, () => ({ id: props.id }));</script>
<template> <div>{{ id }}</div></template>Документация на английском языке - самая актуальная, поскольку её пишет и обновляет команда effector. Перевод документации на другие языки осуществляется сообществом по мере наличия сил и желания.
Помните, что переведенные статьи могут быть неактуальными, поэтому для получения наиболее точной и актуальной информации рекомендуем использовать оригинальную англоязычную версию документации.