Skip to content

previous

Стор со значением, которое было у источника до текущего — всегда на шаг позади.

ts
previous(source);        // Store<T | undefined>
previous(source, seed);  // Store<T | Seed>

При первом изменении «предыдущим» становится начальное значение источника; пока изменений не было, стор читается как undefined — или как seed, если его передали.

Откуда пришли

ts
import { previous } from "@virentia/core/utils";

const route = store<Route>(homeRoute);
const cameFrom = previous(route); // Store<Route | undefined>

reaction({ on: closeClicked, run: () => {
  void navigateFx(cameFrom.value ?? homeRoute);
} });

«Вернуть пользователя туда, где он был» — и не нужно протаскивать исходный роут через каждый вызов навигации.

Направление анимации

Сравниваем прошлый индекс с новым, чтобы понять, в какую сторону ехать слайду:

ts
const activeTab = store(0);
const previousTab = previous(activeTab, 0); // с seed — в типе нет undefined

const direction = computed(() => (activeTab.value > previousTab.value ? "right" : "left"));

Правила на переходах

Некоторым правилам важно не значение, а сам переход: «статус сменился с pending на failed», «пользователь перешёл с пробного тарифа на платный»:

ts
const previousPlan = previous(plan);

reaction({ on: plan, run: (next) => {
  if (previousPlan.value === "trial" && next === "paid") void celebrateFx();
} });

Подписка самого previous создаётся раньше вашей реакции, поэтому к моменту её запуска previousPlan уже держит значение «до». Объявляйте оператор выше правил, которые его читают.

Когда пригодится

  • Источники навигации, направления анимаций, правила на переходах, сравнение «было — стало».
  • Seed (previous(src, seed)) — когда undefined — легальное значение источника и расширять тип нельзя.

Когда не подходит: для полной истории заведите массив в сторе. previous намеренно помнит ровно один шаг.

Поведение

  • Память у каждого скоупа своя: скоуп отстаёт только от собственных записей.
  • Сама память не сериализуется; после SSR-гидрации первое изменение на клиенте подставит «предыдущим» начальное значение источника.
  • Источник-computed работает, но начального значения у него нет — при первом изменении на месте останется seed.