import Video from '@components/video'
import { Bleed } from 'nextra-theme-docs'
import { Callout } from 'nextra/components'

# Автоматическая ревалидация

<Callout>
  Вы можете ревалидировать данные вручную, смотрите [мутацию](/docs/mutation).
</Callout>

## Ревалидация при фокусировке

Когда вы перефокусируете страницу или переключаетесь между вкладками, SWR
автоматически ревалидирует данные.

Это может быть полезно для немедленной синхронизации с последним состоянием. Это
полезно для обновления данных в таких сценариях, как устаревшие мобильные
вкладки или ноутбуки, которые **перешли в спящий режим**.

<Bleed>
  <Video
    src="https://raw.githubusercontent.com/vercel/swr-site/master/.github/videos/focus-revalidate.mp4"
    caption="Видео: использование ревалидации при фокусировке для автоматической синхронизации состояния входа в систему между страницами."
    ratio={307 / 768}
  />
</Bleed>

Эта функция включена по умолчанию. Вы можете её отключить через опцию
[`revalidateOnFocus`](/docs/options).

## Ревалидация с интервалом

Во многих случаях данные меняются из-за нескольких устройств, нескольких
пользователей, нескольких вкладок. Как мы можем со временем обновлять данные на
экране?

SWR даст вам возможность автоматически обновлять данные. Он умный, что означает,
что повторная выборка будет происходить только в том случае, если компонент,
связанный с хуком, находится **на экране**.

<Bleed>
  <Video
    src="https://raw.githubusercontent.com/vercel/swr-site/master/.github/videos/refetch-interval.mp4"
    caption="Видео: когда пользователь вносит изменения, оба сеанса в конечном итоге будут отображать одни и те же данные."
    ratio={307 / 768}
  />
</Bleed>

Вы можете включить её, установив значение для
[`refreshInterval`](/docs/options):

```js
useSWR('/api/todos', fetcher, { refreshInterval: 1000 })
```

Есть также такие опции, как `refreshWhenHidden` и `refreshWhenOffline`. Обе они
отключены по умолчанию, поэтому SWR не будет делать выборку, если веб-страница
не отображается на экране или отсутствует сетевое соединение.

## Ревалидация при повторном подключении

Также полезно провести ревалидацию, когда пользователь снова в сети. Этот
сценарий часто случается, когда пользователь разблокирует свой компьютер, но в
соединение с Интернетом еще нет.

Чтобы данные всегда были актуальными, SWR автоматически делает ревалидацию при
восстановлении сети.

Эта функция включена по умолчанию. Вы можете её отключить через опцию
[`revalidateOnReconnect`](/docs/options).

## Отключение автоматических ревалидаций

Если ресурс **неизменяемый**, и никогда не изменится при повторной ревалидации,
мы можем отключить для него все виды автоматических ревалидаций.

Начиная с версии 1.0, SWR предоставляет вспомогательный хук `useSWRImmutable`,
чтобы пометить ресурс как неизменяемый:

```js
import useSWRImmutable from 'swr/immutable'

// ...
useSWRImmutable(key, fetcher, options)
```

Он имеет тот же API-интерфейс, что и обычный хук `useSWR`. Вы также можете
сделать то же самое, отключив следующие опции ревалидации: It has the same API
interface as the normal `useSWR` hook. You can also do the same thing by disable
the following revalidation options:

```js
useSWR(key, fetcher, {
  revalidateIfStale: false,
  revalidateOnFocus: false,
  revalidateOnReconnect: false
})

// эквивалентно
useSWRImmutable(key, fetcher)
```

`revalidateIfStale`контролирует, должен ли SWR ревалидировать при монтировании и
есть ли устаревшие данные.

Эти 2 хука делают **то же самое**. После кэширования данных они больше никогда
не будут запрашивать их.
