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

<Meta title='@dxtmisha/ru/functional/Composables/useSearchValueRef - Состояние и логика поиска'/>

# `useSearchValueRef`

Низкоуровневый composable для управления состоянием поискового запроса, обработки задержки (debounce) и создания регулярных выражений для сопоставления. Обычно используется внутри `useSearchRef`.

**Параметры:**
- `item: SearchList<T, K>` — настроенный экземпляр `SearchList`, используемый для управления параметрами и значениями.
- `value?: Ref<string>` — внешняя реактивная ссылка на строку поиска. Если не передана, создается внутренняя.

**Возвращает:**
- `search: Ref<string>` — текущее значение поиска (меняется мгновенно).
- `searchDelay: Ref<string>` — значение поиска с учетом задержки (если задержка настроена).
- `loading: Ref<boolean>` — `true` во время ожидания задержки `delay`.

## Архитектура и как это работает

`useSearchValueRef` изолирует логику задержки (`debounce delay`) от фактической фильтрации данных.
Когда пользователь вводит текст в `search.value`, composable:
1. Немедленно устанавливает `loading.value = true`.
2. Ожидает указанную задержку (`delay`) в миллисекундах.
3. Если пользователь продолжает вводить текст в течение задержки, таймер сбрасывается.
4. По истечении таймера значение `search.value` копируется в `searchDelay.value`, и `loading.value` сбрасывается в `false`.

Использование `searchDelay.value` вместо `search.value` для фильтрации гарантирует, что ресурсоёмкие операции поиска выполняются только после того, как пользователь перестанет печатать, что значительно повышает производительность на больших наборах данных.

## Пример использования

```typescript
import { useSearchValueRef } from '@dxtmisha/functional'
import { SearchList } from '@dxtmisha/functional-basic'
import { ref } from 'vue'

const items = [{ id: 1, name: 'Apple' }]
const list = new SearchList(items, ['name'], undefined, { delay: 300 })
const { search, searchDelay, loading } = useSearchValueRef(list)

search.value = 'app'
// loading.value становится true
// Через 300мс searchDelay.value станет 'app' и loading.value станет false
```
