Хуки жизненного цикла
- Контроллеры
- Хуки жизненного цикла
- Действия (Actions)
- Объекты (Targets)
- Переменные контроллера (Values)
-
CSS классы
Специальные методы, называемые хуками жизненного цикла, позволяют вам реагировать каждый раз, когда контроллер или определенные объекты подключаются к документу и отсоединяются от него.
import { Controller } from '@hotwired/stimulus';
export default class extends Controller {
connect() {
// …
}
}
Методы
Вы можете определить любой из следующих методов в своем контроллере:
| Метод | Вызывается Stimulus… |
|---|---|
initialize() |
Один раз, при первом инстанцировании контроллера |
[name]TargetConnected(target: Element) |
Каждый раз, когда объект подключается к DOM |
connect() |
Каждый раз, когда контроллер подключается к DOM |
[name]TargetDisconnected(target: Element) |
Каждый раз, когда объект отсоединяется от DOM |
disconnect() |
Каждый раз, когда контроллер отсоединяется от DOM |
Подключение
Контроллер подключен к документу, когда верны оба следующих условия:
- его элемент присутствует в документе (т.е. является потомком
document.documentElement, элемента<html>) - его идентификатор присутствует в атрибуте
data-controllerэлемента
Когда контроллер становится подключенным, Stimulus вызывает его метод connect().
Объекты
Объект подключен к документу, если верны оба следующих условия:
- его элемент присутствует в документе как потомок соответствующего элемента контроллера
- его идентификатор присутствует в атрибуте
data-{identifier}-targetэлемента
Когда объект становится подключенным, Stimulus вызывает метод [name]TargetConnected() своего контроллера, передавая целевой элемент в качестве параметра. Хуки жизненного цикла [name]TargetConnected() срабатывают до хука контроллера connect().
Отключение
Подключенный контроллер впоследствии станет отключенным, когда одно из предыдущих условий станет ложным, например, при любом из следующих сценариев:
- элемент явно удален из документа с помощью
Node#removeChild()илиChildNode#remove(). - один из родительских элементов элемента удален из документа
- у одного из родительских элементов элемента его содержимое заменено с помощью
Element#innerHTML= - атрибут
data-controllerэлемента удален или изменен - документ устанавливает новый элемент
<body>, например, при изменении страницы Turbo
Когда контроллер становится отключенным, Stimulus вызывает его метод disconnect().
Объекты
Подключенный объект впоследствии станет отключенный, когда одно из предыдущих условий станет ложным, например, при любом из следующих сценариев:
- элемент явно удален из документа с помощью
Node#removeChild()илиChildNode#remove(). - один из родительских элементов элемента удален из документа
- у одного из родительских элементов элемента его содержимое заменено с помощью
Element#innerHTML= - атрибут
data-{identifier}-targetэлемента удален или изменен - документ устанавливает новый элемент
<body>, например, при изменении страницы Turbo
Когда объект становится отключенным, Stimulus вызывает метод [name]TargetDisconnected() своего контроллера, передавая целевой элемент в качестве параметра. Хуки жизненного цикла [имя]TargetDisconnected() срабатывают до хука контроллера disconnect().
Переподключение
Отключенный контроллер может быть снова подключен позднее.
Когда это происходит, например, после удаления элемента контроллера из документа, а затем его повторного подключения, Stimulus повторно использует предыдущий экземпляр контроллера элемента, вызывая его метод connect() несколько раз.
Аналогично, отключенный объект может быть подключен снова в более позднее время. Stimulus вызовет метод [name]TargetConnected() своего контроллера несколько раз.
Очерёдность и тайминги
Stimulus следит за изменениями на странице асинхронно, используя DOM MutationObserver API.
Это означает, что Stimulus вызывает методы жизненного цикла вашего контроллера асинхронно после внесения изменений в документ, в следующей microtask после каждого изменения.
Методы жизненного цикла по-прежнему выполняются в порядке их появления, поэтому два вызова метода контроллера connect() всегда будут разделены одним вызовом disconnect(). Аналогично, два вызова метода контроллера [name]TargetConnected() для данного объекта всегда будут разделены одним вызовом [name]TargetDisconnected() для того же объекта.
- Контроллеры
- Хуки жизненного цикла
- Действия (Actions)
- Объекты (Targets)
- Переменные контроллера (Values)
-
CSS классы