Directives personnalisées

Introduction

En supplément de l’ensemble de directives fournies par défaut (v-model et v-show), Vue vous permet également d’enregistrer vos propres directives. Notez qu’avec Vue 2, les composants sont la forme principale de réutilisabilité et d’abstraction du code. Il y a cependant des cas où vous aurez juste besoin d’un accès de bas niveau aux éléments du DOM, et c’est là que les directives personnalisées vous seraient utiles. Un exemple pourrait être la prise du focus sur un élément de champ, comme celui-ci :

Quand la page se charge, cet élément prend le focus (notez que l’autofocus ne fonctionne pas sur Safari mobile). En fait, si vous n’avez cliqué sur rien du tout depuis votre arrivée sur la page, le champ ci-dessous devrait avoir le focus. À présent, jetons un œil à la directive qui pourrait accomplir cela :

// Enregistrer une directive globale appelée focus
Vue.directive('focus', {
// Quand l'élément lié est inséré dans le DOM...
inserted: function (el) {
// L'élément prend le focus
el.focus()
}
})

Si vous préférez enregistrer à la place la directive en local, les composants acceptent également l’option directives :

directives: {
focus: {
// définition de la directive
}
}

Puis dans un template, vous pouvez utiliser le nouvel attribut v-focus sur n’importe quel élément, comme celui-ci :

<input v-focus>

Fonctions de hook

Un objet de définition de directive peut fournir plusieurs fonctions de hook (toutes optionnelles) :

Nous allons explorer les arguments passés à ces hooks (c.-à-d. el, binding, vnode, et oldVnode) dans la prochaine section.

Arguments des hooks d’une directive

Les hooks d’une directive ont accès à ces arguments :

À l’exception de el, vous devez traiter ces arguments comme étant en lecture seule (« read-only ») et ne jamais les modifier. Si vous souhaitez partager des informations entre les hooks, il est recommandé de le faire à travers les attributs de données sur mesure de ses éléments (voir dataset).

Un exemple de directive personnalisée utilisant plusieurs de ces propriétés :

<div id="hook-arguments-example" v-demo:foo.a.b="message"></div>
Vue.directive('demo', {
bind: function (el, binding, vnode) {
var s = JSON.stringify
el.innerHTML =
'name: ' + s(binding.name) + '<br>' +
'value: ' + s(binding.value) + '<br>' +
'expression: ' + s(binding.expression) + '<br>' +
'argument: ' + s(binding.arg) + '<br>' +
'modifiers: ' + s(binding.modifiers) + '<br>' +
'vnode keys: ' + Object.keys(vnode).join(', ')
}
})
new Vue({
el: '#hook-arguments-example',
data: {
message: 'bonjour !'
}
})

Fonction abrégée

Dans de nombreux cas, vous pourriez vouloir le même comportement pour les hooks bind et update, sans avoir besoin des autres hooks. Par exemple :

Vue.directive('color-swatch', function (el, binding) {
el.style.backgroundColor = binding.value
})

Littéraux objet

Si votre directive a besoin de plusieurs valeurs, vous pouvez également passer un objet JavaScript. Souvenez-vous, une directive peut accepter n’importe quelle expression JavaScript.

<div v-demo="{ color: 'white', text: 'bonjour !' }"></div>
Vue.directive('demo', function (el, binding) {
console.log(binding.value.color) // => "white"
console.log(binding.value.text) // => "bonjour !"
})