Это объясняется в документации Передача атрибутов и событий дочерним элементам / компонентам :
Если вы используете функциональные компоненты на основе шаблонов, вам также придется вручную добавлять атрибуты и прослушиватели. Поскольку у нас есть доступ к содержимому отдельного контекста, мы можем использовать data.attrs
для передачи любых атрибутов HTML и listeners
(псевдоним для data.on
) для передачи любых прослушивателей событий.
На самом базовом уровне вы можете делегировать всех слушателей следующим образом:
<some-child v-on="listeners"></some-child>
Если вы хотите привязать только слушателя change
, вы можете сделать:
<some-child @change="listeners.change"></some-child>
но произойдет сбой, если listeners.change
не определено / пусто (не предоставляется функциональному компоненту).
Если вам нужно справиться с ситуацией, когда нет change
слушателя, тогда вы можете сделать эту мерзость:
<some-child @change="listeners.change || (() => {})"></some-child>
в противном случае вы должны были бы решить, написав функцию рендеринга вручную, поскольку я не думаю, что можно условно назначить слушателя change
для <some-child>
в шаблоне функционального компонента. (Или, может быть, вы можете? Я не уверен.)