previous
Стор со значением, которое было у источника до текущего — всегда на шаг позади.
previous(source); // Store<T | undefined>
previous(source, seed); // Store<T | Seed>При первом изменении «предыдущим» становится начальное значение источника; пока изменений не было, стор читается как undefined — или как seed, если его передали.
Откуда пришли
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);
} });«Вернуть пользователя туда, где он был» — и не нужно протаскивать исходный роут через каждый вызов навигации.
Направление анимации
Сравниваем прошлый индекс с новым, чтобы понять, в какую сторону ехать слайду:
const activeTab = store(0);
const previousTab = previous(activeTab, 0); // с seed — в типе нет undefined
const direction = computed(() => (activeTab.value > previousTab.value ? "right" : "left"));Правила на переходах
Некоторым правилам важно не значение, а сам переход: «статус сменился с pending на failed», «пользователь перешёл с пробного тарифа на платный»:
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.