import {Meta} from '@storybook/addon-docs/blocks'

<Meta title='@dxtmisha/ru/functional/# Расширенные вычисляемые свойства'/>

# Расширенные вычисляемые свойства (Custom Computed)

В библиотеке присутствуют три специализированные обертки над стандартным `computed` из Vue 3. Они решают типовые архитектурные задачи: асинхронные вычисления, отвязка от жизненного цикла компонента и мультиязычные значения.

## 1. Асинхронные вычисления (`computedAsync`)

Стандартный `computed` во Vue является строго синхронным. `computedAsync` позволяет вам безопасно использовать `async/await` геттеры.

**Особенности:**
- Выполнение начинается только при первом обращении (лениво).
- Автоматически перезапускается при изменении реактивных зависимостей внутри геттера (благодаря встроенному `watchEffect`).
- Позволяет игнорировать определенные результаты (параметр `ignore`), чтобы не дергать UI лишний раз.

**Пример использования:**
```typescript
import { ref } from 'vue'
import { computedAsync } from '@dxtmisha/functional'

const userId = ref(1)

const userData = computedAsync(async () => {
  // Автоматически перезапросит данные при изменении userId.value
  const response = await fetch(`/api/users/${userId.value}`)
  return await response.json()
})
```

## 2. Глобальное кеширование ("Вечный" `computedEternity`)

Обычные вычисляемые свойства и вотчеры уничтожаются вместе с компонентом, в котором были созданы (`setup`). `computedEternity` помещает вычисление (и его `watchEffect`) в независимый глобальный `effectScope`. 

**Особенности:**
- Идеально для тяжелых данных, которые нужно загрузить один раз при переходе на страницу, но сохранить в кэше и поддерживать их реактивную актуальность даже если пользователь ушел с этой страницы.
- Начинает работу только после первого вызова (on-demand).
- "Живет вечно" — пока работает приложение браузера.
- Доступно только для чтения.

**Пример использования:**
```typescript
import { computedEternity } from '@dxtmisha/functional'

// Вычисление будет жить в памяти до закрытия вкладки браузера
const heavyGlobalConfig = computedEternity(async () => {
  return await fetch('/api/heavy-config').then(res => res.json())
})
```

## 3. Зависимость от языка (`computedByLanguage`)

Удобный синтаксический сахар для значений, которые должны немедленно пересчитываться при смене языка в словарях локализации.

**Особенности:**
- Жестко привязан к внутрисистемному `GeoRef`.
- Позволяет задать условие (`conditions`), при котором геттер вообще должен срабатывать.
- Имеет встроенный fallback механизм (`getterNone`), который возвращается, если основное значение `undefined` или условие не выполнено.

**Пример использования:**
```typescript
import { computedByLanguage } from '@dxtmisha/functional'

const pageTitle = computedByLanguage(
  // Успешный геттер (сработает если условие выполнено)
  () => dictionary.value.title,
  
  // Альтернатива (fallback), если нет перевода или условие = false
  () => 'Default Title',
  
  // Наше условие (опционально)
  () => isReady.value === true
)
```
