Методы
import { useUnit } from "effector-vue/composition";
since

useUnit появился в effector-vue 23.0.0

Связывает сторы с реактивностью Vue. События и эффекты привязывает к текущему скоупу, чтобы вызывать их из обработчиков DOM-событий.

Только для Vue 3 и Composition API.

В будущем

Этот API может полностью заменить:

Со временем эти API могут объявить устаревшими и удалить.

Методы

useUnit(unit, options?)

Формула

useUnit(event: EventCallable<T>, options?: ScopeOptions): (payload: T) => T;
useUnit(effect: Effect<Params, Done, Fail>, options?: ScopeOptions): (payload: Params) => Promise<Done>;

Аргументы

  1. unit (Событие или эффект): событие или эффект, который привяжется к текущему скоупу. Производное событие, результат map или filter, типы не принимают: его нельзя вызвать
  2. options? (Object): { scope, forceScope }, см. опции скоупа
since

Аргумент options появился в effector-vue 23.3.0

Возвращает

(Function): функция для обработчиков событий. Запускает юнит в текущем скоупе. Если скоуп не найден, возвращается сам юнит, как в useUnit из effector-react

since

С effector-vue 23.2.0 для одного эффекта возвращается привязанная функция. С effector-vue 23.3.0 без скоупа возвращается сам юнит

Примеры

Базовый пример

model.ts
import { createEvent, createStore } from "effector";
export const incremented = createEvent();
export const $count = createStore(0);
$count.on(incremented, (count) => count + 1);
App.vue
<script setup lang="ts">
import { useUnit } from "effector-vue/composition";
import { incremented } from "./model";
const onClick = useUnit(incremented);
</script>
<template>
<button @click="onClick">increment</button>
</template>

useUnit($store, options?)

Формула

useUnit($store: Store<State>, options?: ScopeOptions): Readonly<Ref<State>>;

Аргументы

  1. $store (Стор): стор, который свяжется с реактивностью Vue
  2. options? (Object): { scope, forceScope }, см. опции скоупа
since

Аргумент options появился в effector-vue 23.3.0

Возвращает

(Readonly<Ref<State>>): неглубокий readonly-ref. Его value это само состояние стора, без копии и без реактивного прокси, поэтому оно равно scope.getState($store)

since

Ref неглубокий с effector-vue 23.3.0. Раньше value был глубоким readonly-прокси над состоянием

Важно

От записи защищён только сам ref. Запись во вложенное поле value меняет состояние стора на месте, и обновления не происходит. Меняйте состояние через события.

Примеры

Базовый пример

App.vue
<script setup lang="ts">
import { useUnit } from "effector-vue/composition";
import { $count } from "./model";
const count = useUnit($count);
</script>
<template>
<p>Count: {{ count }}</p>
</template>

useUnit(shape, options?)

Формула

useUnit({ a: Store<A>, b: EventCallable<B> }, options?: ScopeOptions): { a: Readonly<Ref<A>>, b: (payload: B) => B };
useUnit([Store<A>, EventCallable<B>], options?: ScopeOptions): [Readonly<Ref<A>>, (payload: B) => B];

Аргументы

  1. shape: объект или массив событий, эффектов и сторов. Каждый юнит обрабатывается как в useUnit: стор становится реактивным значением, событие или эффект становится функцией для обработчиков событий
  2. options? (Object): { scope, forceScope }, см. опции скоупа
since

Аргумент options появился в effector-vue 23.3.0

Возвращает

(Object или Array) с теми же ключами, что у аргумента:

Все сторы одного вызова используют одну подписку.

Примеры

Базовый пример

App.vue
<script setup lang="ts">
import { useUnit } from "effector-vue/composition";
import { $count, incremented } from "./model";
const { count, handleClick } = useUnit({ count: $count, handleClick: incremented });
</script>
<template>
<p>Count: {{ count }}</p>
<button @click="handleClick">increment</button>
</template>

Опции скоупа

  • scope? (Scope): скоуп, из которого читаются сторы и к которому привязываются события, вместо скоупа приложения
  • forceScope? (boolean): бросить ошибку, если скоуп не найден, вместо перехода в глобальный режим. Перекрывает опцию forceScope плагина для этого вызова

Порядок поиска скоупа описан в разделе Как выбирается скоуп.

const count = useUnit($count, { scope });
const onClick = useUnit(incremented, { forceScope: true });

Время жизни

Подписка живёт, пока жив компонент или effect scope, где вызван useUnit, и снимается через onScopeDispose. Вызов внутри отдельного effectScope() отписывается, когда этот scope останавливают. Во время серверного рендера подписок нет: ref читает скоуп при каждом обращении. Опция live плагина перекрывает это определение.

since

Отписка вместе с effect scope, одна подписка на вызов и отсутствие подписок при серверном рендере появились в effector-vue 23.3.0

Перевод поддерживается сообществом

Документация на английском языке - самая актуальная, поскольку её пишет и обновляет команда effector. Перевод документации на другие языки осуществляется сообществом по мере наличия сил и желания.

Помните, что переведенные статьи могут быть неактуальными, поэтому для получения наиболее точной и актуальной информации рекомендуем использовать оригинальную англоязычную версию документации.

Соавторы