Solution pour Vue 2
Vous pouvez transférer tous les attributs et listeners (y compris v-model
) du parent à l'enfant comme suit :
<input v-bind="$attrs" v-on="$listeners" />
Voici le documentation pour $attrs :
Contient des liaisons d'attributs de portée parentale (à l'exception de class
et style
) qui ne sont pas reconnus (et extraits) comme des props. Lorsqu'un composant n'a pas de props déclaré, il contient essentiellement tous les liens de portée parentale (à l'exception de class
et style
), et peut être transmis à un composant interne par l'intermédiaire de v-bind=" $attrs"
- utile lors de la création de composants d'ordre supérieur .
Veillez à définir inheritAttrs
à false
pour éviter que les attributs soient appliqués à l'élément racine (par défaut, tous les attributs sont appliqués à l'élément racine).
Voici le documentation pour $listeners :
Contient des écouteurs d'événements v-on de portée parentale (sans .native
modificateurs). Cette information peut être transmise à un composant interne par le biais de la fonction v-on="$listeners"
- utile lors de la création de composants enveloppants transparents .
Parce que v-model
est juste un raccourci pour v-bind
+ v-on
il est également transféré.
Notez que cette technique est disponible depuis Vue 2.4.0 (juillet 2017), où cette fonctionnalité est décrite comme "Création plus facile de composants wrappers".
Solution pour Vue 3
Vue 3 a retiré le $listeners
car les écouteurs se trouvent maintenant dans l'objet $attrs
également. Il suffit donc de faire ça :
<input v-bind="$attrs" />
Voici le la documentation pour $attrs
:
Contient la portée du parent liaisons et événements d'attributs qui ne sont pas reconnus (et extraits) comme des accessoires de composants ou des événements personnalisés. Lorsqu'un composant n'a pas d'accessoires ou d'événements personnalisés déclarés, il contient essentiellement toutes les liaisons de portée parentale et peut être transmis à un composant interne par l'intermédiaire de v-bind="$attrs"
- utile lors de la création de composants d'ordre supérieur.
Si votre composant n'a qu'un seul élément Root (Vue 3 autorise plusieurs éléments Root), alors le paramètre inheritAttrs
à false
est toujours nécessaire pour éviter que des attributs soient appliqués à l'élément Root.
Voici le la documentation pour inheritAttrs
Par défaut, les liaisons d'attributs de l'étendue parentale qui ne sont pas reconnues comme des props seront "tombées". Cela signifie que lorsque nous avons un composant à racine unique Ces liens seront appliqués à l'élément Root du composant enfant comme des attributs HTML normaux. Lors de la création d'un composant qui englobe un élément cible ou un autre composant, ce n'est pas toujours le comportement souhaité. En définissant inheritAttrs
à false
Il est possible de désactiver ce comportement par défaut. Les attributs sont disponibles via l'option $attrs
et peut être explicitement lié à un élément non-Root à l'aide de la propriété d'instance v-bind
.
Une autre différence avec Vue 2 est que le $attrs
comprend maintenant class
et style
.
Voici un extrait de "Disabling Attribute Inheritance" (Désactiver l'héritage des attributs) :
En fixant le inheritAttrs
option pour false
vous pouvez contrôler l'application à d'autres éléments d'attributs permettant d'utiliser le composant $attrs
qui comprend tous les attributs non inclus dans le composant props
et emits
propriétés (par exemple, class
, style
, v-on
les auditeurs, etc.) .
3 votes
Ça m'a aidé.