Last updated
Last updated
Иногда нужно подписаться на нативные события браузера на корневом элементе компонента. В таких случаях можно применять модификатор .native
для v-on
:
Иногда это может быть полезно, но это не очень хорошая идея, когда вы пытаетесь прослушивать очень специфичный элемент, к примеру <input>
. Например, компонент <base-input>
можно переделать так, чтобы корневой элемент был фактически элементом <label>
:
В этом случае слушатель .native
в родителе просто тихо перестанет работать. Ошибок не будет, но обработчик onFocus
не будет вызываться, когда мы этого ожидаем.
Для решения этой проблемы Vue предоставляет свойство $listeners
, содержащее объект всех слушателей, которые используются на компоненте. Например:
Используя свойство $listeners
, вы можете передать все слушатели событий на компоненте на определённый дочерний элемент с помощью v-on="$listeners"
. Для таких элементов как <input>
, вы также можете захотеть работоспособности с v-model
, для чего бывает полезно создать новое вычисляемое свойство для слушателей, например inputListeners
указанный ниже:
Теперь компонент <base-input>
стал полностью прозрачной обёрткой, что означает, что его можно использовать точно также, как и обычный элемент <input>
: все те же атрибуты и слушатели будут работать без указания модификатора .native
.