# Composition
# mixins
Type:
Array<Object>
Détails:
L'option
mixins
accepte un tableau d'objets mixin. Ces objets mixin peuvent contenir des options d'instance comme des objets d'instance normaux, et ils seront fusionnés avec les options éventuelles en utilisant la logique de fusion de certaines options. Par exemple, si votre mixin contient un hookcreated
et que le composant lui-même en a également un, les deux fonctions seront appelées.Les hooks de mixin sont appelés dans l'ordre dans lequel ils sont fournis, et appelés avant les hooks du composant.
Exemple:
const mixin = { created: function() { console.log(1) } } Vue.createApp({ created() { console.log(2) }, mixins: [mixin] }) // => 1 // => 2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15Voir aussi: Mixins
# extends
Type:
Object | Function
Détails:
Permet d'étendre de manière déclarative un autre composant (peut être un objet d'options simple ou un constructeur). Ceci est principalement destiné à faciliter l'extension entre les composants de fichier unique.
Il est similaire aux
mixins
.Exemple:
const CompA = { ... } // étend CompA sans avoir à appeler `Vue.extend` sur l'un ou l'autre const CompB = { extends: CompA, ... }
1
2
3
4
5
6
7
# provide / inject
Type:
- provide:
Object | () => Object
- inject:
Array<string> | { [key: string]: string | Symbol | Object }
- provide:
Détails:
Cette paire d'options est utilisée ensemble pour permettre à un composant parent de servir d'injecteur de dépendances pour tous ses descendants, quelle que soit la profondeur de la hiérarchie des composants, tant qu'ils sont dans la même arborescence. Si vous êtes familier avec React, cela est très similaire à la fonctionnalité
context
de React.L'option
inject
doit être soit:- un tableau de chaînes de caractères ou
- un objet où les clés sont les noms de la liaison locale et la valeur est soit:
- la clé (string ou Symbol) pour rechercher dans les injections disponibles ou
- un objet où:
- la propriété
from
est la clé (string ou Symbol) à rechercher dans les injections disponibles et - la propriété
default
est utilisée comme valeur de secours
- la propriété
Note: les liaisons
provide
etinject
ne sont PAS réactives. C'est intentionnel. Cependant, si vous transmettez un objet réactif, les propriétés de cet objet restent réactives.Exemple:
// composant parent fournissant 'foo' const Provider = { provide: { foo: 'bar' } // ... } // composant enfant injectant 'foo' const Child = { inject: ['foo'], created() { console.log(this.foo) // => "bar" } // ... }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16Avec les Symbols ES2015, la fonction
provide
et l'objetinject
:const s = Symbol() const Provider = { provide() { return { [s]: 'foo' } } } const Child = { inject: { s } // ... }
1
2
3
4
5
6
7
8
9
10
11
12
13
14En utilisant une valeur injectée comme valeur par défaut pour une prop:
const Child = { inject: ['foo'], props: { bar: { default() { return this.foo } } } }
1
2
3
4
5
6
7
8
9
10En utilisant une valeur injectée comme entrée de données:
const Child = { inject: ['foo'], data() { return { bar: this.foo } } }
1
2
3
4
5
6
7
8Les injections peuvent être facultatives avec une valeur par défaut:
const Child = { inject: { foo: { default: 'foo' } } }
1
2
3
4
5S'il doit être injecté à partir d'une propriété avec un nom différent, utilisez
from
pour désigner la propriété source:const Child = { inject: { foo: { from: 'bar', default: 'foo' } } }
1
2
3
4
5
6
7
8Semblable aux valeurs par défaut de prop, vous devez utiliser une "factory function" pour les valeurs non primitives:
const Child = { inject: { foo: { from: 'bar', default: () => [1, 2, 3] } } }
1
2
3
4
5
6
7
8Voir aussi: Provide / Inject
# setup
- Type:
Function
La fonction setup
est une nouvelle option de composant. Elle sert de point d'entrée pour l'utilisation du Composition API à l'intérieur des composants.
Moment d'Invocation
setup
est appelée juste après la résolution initiale des props lors de la création d'une instance de composant. Au niveau du lifecycle, il est appelé avant le hook beforeCreate.Usage avec les Templates
Si
setup
retourne un objet, les propriétés de l'objet seront fusionnées avec le contexte de rendu du template du composant:<template> <div>{{ count }} {{ object.foo }}</div> </template> <script> import { ref, reactive } from 'vue' export default { setup() { const count = ref(0) const object = reactive({ foo: 'bar' }) // exposer au template return { count, object } } } </script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20Notez que les refs renvoyés par
setup
sont automatiquement déballés lors de l'accès dans le template, donc il n'y a pas besoin de.value
dans les templates.Usage avec les Fonctions de Rendu / JSX
setup
peut également renvoyer une fonction de rendu, qui peut directement utiliser l'état réactif déclaré dans la même scope:import { h, ref, reactive } from 'vue' export default { setup() { const count = ref(0) const object = reactive({ foo: 'bar' }) return () => h('div', [count.value, object.foo]) } }
1
2
3
4
5
6
7
8
9
10Arguments
La fonction reçoit les props résolus comme premier argument:
export default { props: { name: String }, setup(props) { console.log(props.name) } }
1
2
3
4
5
6
7
8Notez que cet objet
props
est réactif - c'est-à-dire qu'il est mis à jour lorsque de nouveaux props sont passés, et peut être observé et réagir en utilisantwatchEffect
ouwatch
:export default { props: { name: String }, setup(props) { watchEffect(() => { console.log(`name is: ` + props.name) }) } }
1
2
3
4
5
6
7
8
9
10Cependant, ne déstructurez PAS l'objet
props
, car il perdra sa réactivité:export default { props: { name: String }, setup({ name }) { watchEffect(() => { console.log(`name is: ` + name) // Ne sera pas réactif! }) } }
1
2
3
4
5
6
7
8
9
10L'objet
props
est immuable pour le code utilisateur pendant le développement (émettra un avertissement si le code utilisateur tente de le muter).Le deuxième argument fournit un objet de contexte qui expose une liste sélective de propriétés précédemment exposées sur
this
:const MyComponent = { setup(props, context) { context.attrs context.slots context.emit } }
1
2
3
4
5
6
7attrs
etslots
sont des proxys des valeurs correspondantes sur l'instance de composant interne. Cela garantit qu'ils exposent toujours les dernières valeurs même après les mises à jour afin que nous puissions les déstructurer sans nous soucier d'accéder à une référence périmée:const MyComponent = { setup(props, { attrs }) { // une fonction qui pourrait être appelée ultérieurement function onClick() { console.log(attrs.foo) // garantie d'être la dernière référence } } }
1
2
3
4
5
6
7
8Il y a un certain nombre de raisons pour placer
props
comme premier argument séparé au lieu de l'inclure dans le contexte:Il est beaucoup plus courant pour un composant d'utiliser des
props
que les autres propriétés, et très souvent un composant n'utilise que desprops
.Avoir
props
comme argument séparé facilite la saisie individuelle sans gâcher les types des autres propriétés présent dans le contexte. Il permet également de conserver une signature cohérente entresetup
,render
et les composants fonctionnels simples avec le support de TSX.
Voir aussi: Composition API