Notions de base de Vue : introduction aux observateurs de Vue.js

Les observateurs peuvent être un outil puissant, mais ne doivent être utilisés que lorsqu’il n’existe pas de meilleure option. Examinons cela.
Les observateurs de Vue.js sont l’un des outils les plus puissants, l’un des plus flexibles mais aussi l’un des plus faciles à utiliser à mauvais escient.
Commençons par jeter un œil à ce qu’est un observateur.
Que sont les observateurs
Souvent, lorsque vous écrivez du code, vous vous retrouverez à regarder une propriété ou une valeur calculée et à souhaiter pouvoir faire quelque chose lorsque la propriété calculée ou de données changements de valeur.
Dans le monde Vue, nous regardons le faire quelque chose partie de la déclaration ci-dessus et appelez-la un effet secondaire.
Un exemple pratique (mais plutôt avancé) serait de regarder le fonctionnement d’un composant prop
et utilisez Vue Router pour modifier l’URL actuelle. Dans cet exemple, le effet secondaire utiliserait Vue Router pour modifier l’URL actuelle chaque fois qu’un prop
changements.
Un exemple plus simple serait d’observer la valeur liée d’un <select>
élément et afficher une alerte programmée pour l’utilisateur l’informant que les modifications apportées à sa sélection ont été enregistrées.
Dans cet article, nous allons explorer le second, et j’ai volontairement décrit d’abord le scénario « complexe » car l’exemple sur lequel nous allons travailler peut être réécrit sans utiliser d’observateurs – ce qui est toujours préférable.
Ce que les observateurs ne sont pas
Les observateurs ne sont pas des propriétés calculées. Si jamais vous vous retrouvez à créer un observateur pour écrire la valeur d’une autre propriété, par exemple, vous devez d’abord vous demander s’il peut s’agir d’une propriété calculée.
C’est un piège courant. J’ai vu de nombreux développeurs, débutants comme experts, utiliser abusivement les observateurs lorsqu’une solution plus simple avec des propriétés calculées ou d’autres outils tels que le trading d’un v-model
pour les auditeurs d’événements, cela aurait fait encore mieux le travail (nous y reviendrons plus tard).
Les observateurs sont un outil incroyable, et vous devrait utilisez-les, mais seulement lorsqu’aucun autre outil ne fera un meilleur travail. Le débogage et le suivi des observateurs sont bien plus compliqués qu’un outil tel que les propriétés calculées. Épargnez-vous, à vous et à vos collègues, des maux de tête et réfléchissez vraiment si en utiliser une est la bonne solution pour votre problème donné.
Comment utiliser un observateur
Afin d’apprendre à utiliser les observateurs, nous allons créer une démo du scénario que j’ai présenté plus tôt : chaque fois que l’utilisateur modifie la valeur d’une sélection, nous ferons comme si nous enregistrions cette valeur sur le backend et avertirions l’utilisateur que ses modifications ont été enregistrées. .
Nous allons commencer par présenter le HTML et configurer un v-model
à la sélection afin que nous puissions garder une trace de la valeur sélectionnée par l’utilisateur.
<script>
export default {
data: () => ({
pet: 'cat',
changesSaved: false
})
}
</script>
<template>
<header>
<p v-if="changesSaved" style="border: 1px solid white; padding: 5px 10px; margin-bottom: 10px;">
Your changes have been saved
</p>
</header>
<main>
<select v-model="pet">
<option value="cat" :selected="value === 'cat'">Cat</option>
<option value="dog" :selected="value === 'dog'">Dog</option>
<option value="hamster" :selected="value === 'hamster'">Hamster</option>
</select>
</main>
</template>
Notez que le long du select
J’ai ajouté un p
balise à l’en-tête qui ne s’affichera qu’à chaque fois changesSaved
est true
.
Ce dont nous avons besoin, c’est de créer un effet secondaire. Chaque fois que la valeur de pet
changements, nous voulons afficher quelque chose à l’utilisateur en conséquence.
Ajoutons un observateur pour cela.
<script>
export default {
data: () => ({
pet: 'cat',
changesSaved: false
}),
watch: {
pet (val, oldVal) {
if (val === oldVal) return
this.changesSaved = true
setTimeout(() => {
this.changesSaved = false
}, 2000)
}
}
}
</script>
<template>
<header>
<p v-if="changesSaved" style="border: 1px solid white; padding: 5px 10px; margin-bottom: 10px;">
Your changes have been saved
</p>
</header>
<main>
<select v-model="pet">
<option value="cat" :selected="value === 'cat'">Cat</option>
<option value="dog" :selected="value === 'dog'">Dog</option>
<option value="hamster" :selected="value === 'hamster'">Hamster</option>
</select>
</main>
</template>
Lors de l’ajout d’un observateur, nous ajoutons une nouvelle propriété au watch
objet dans les options de notre composant. Le nom de cette propriété doit correspondre le nom du data
propriété ou computed
propriété que nous essayons de surveiller – dans ce cas pet
.
Chaque observateur recevra deux paramètres : le premier val
avec la valeur vers laquelle la propriété surveillée change, et la seconde oldVal
avec la valeur qu’il avait auparavant.
Pour faire bonne mesure, nous vérifions que val
et oldVal
ne sont pas les mêmes. Si c’est le cas, nous ne souhaitons pas afficher de notification pour l’utilisateur, nous return
hors de la fonction.
Ensuite, nous modifions la valeur de changesSaved
à true
de sorte que la v-if
La déclaration rend notre alerte à l’utilisateur sur l’écran. Notez que le setInterval
L’instruction qui suit s’exécutera après 2 secondes (2000 ms), inversant la valeur de changesSaved
retour à false
.
Nous avons créé avec succès un observateur ! Pour une vérification rapide, nous pouvons toujours essayer de déterminer s’il existe un moyen de résoudre ce problème avec une propriété calculée, et en raison de la nature de la propriété setTimeout
que nous souhaitons ajouter ici, cela ne serait pas possible autrement.
La meilleure façon
Au départ, je vous ai dit que le problème avec cet exemple était qu’il existait une autre façon de résoudre le problème sans observateurs. Je présenterai cette solution en utilisant une double liaison divisée sur le select
comme la meilleure manière d’aborder le problème.
<script>
export default {
data: () => ({
pet: 'cat',
changesSaved: false
}),
methods: {
updatePet(event) {
this.pet = event.target.value
this.changesSaved = true
setTimeout(() => {
this.changesSaved = false
}, 2000)
}
}
}
</script>
<template>
<header>
<p v-if="changesSaved" style="border: 1px solid white; padding: 5px 10px; margin-bottom: 10px;">
Your changes have been saved
</p>
</header>
<main>
<select :value="pet" @change="updatePet">
<option value="cat" :selected="value === 'cat'">Cat</option>
<option value="dog" :selected="value === 'dog'">Dog</option>
<option value="hamster" :selected="value === 'hamster'">Hamster</option>
</select>
</main>
</template>
Pour ce scénario moins compliqué, la possibilité de fractionner le v-model
dans value
et @change
est plus propre. Il n’y a pas d’observateurs difficiles à déboguer et le code est plus facile à suivre.
Emballer
Il peut y avoir des scénarios dans lesquels votre code nécessitera un observateur, et pour ces scénarios, nous ne pourrions pas demander un meilleur outil dans Vue. Les observateurs sont flexibles et puissants, mais leur coût de débogage est élevé et ils sont plus difficiles à comprendre en un coup d’œil.
Gardez cet outil à portée de main et demandez-vous toujours s’il existe une meilleure façon d’aborder le problème.
Source link