Propriétés Watch de Vue3

Dans ce chapitre, nous présenterons les propriétés watch de Vue3watch, nous pouvons utiliserwatchpour répondre aux changements de données.

watchIl est utilisé pour surveiller les changements de propriétés réactives et exécuter des opérations spécifiques lorsque les propriétés changent. C'est un mécanisme réactif de Vue qui vous permet de réagir en conséquence lorsque les données changent et d'exécuter une logique personnalisée.

watchIl offre davantage de flexibilité lorsque les propriétés réactives changent, permettant à vos composants de mieux répondre aux changements de données et d'exécuter la logique correspondante.

L'exemple suivant implémente un compteur en utilisant watch :

Exemple

<div id = "app">
    <p style = "font-size:25px;">Compteur: {{ counter }}</p>
    <button @click = "counter++" style = "font-size:25px;">Cliquez-moi</button>
</div>
   
<script>
const app = {
  data() {
    return {
      counter: 1
    }
  }
}
vm = Vue.createApp(app).mount('#app')
vm.$watch('counter', function(nval, oval) {
    alert('Changement de valeur du compteur :' + oval + ' changé en ' + nval + '!');
});
</script>

Essayez-le vous-même »

L'exemple suivant effectue une conversion entrekilomètresetmètres:

Exemple

<div id = "app">
Kilomètres: <input type = "text" v-model = "kilometers"  @focus="currentlyActiveField = 'kilometers'">
Riz: <input type = "text" v-model = "meters" @focus="currentlyActiveField = 'meters'">
</div>
<p id="info"></p>    
<script>
const app = {
  data() {
    return {
      kilometers : 0,
      meters:0
    }
  },
  watch : {
    kilometers:function(newValue, oldValue) {
      // Vérifier s'il s'agit du champ de saisie actuel
      if (this.currentlyActiveField === 'kilometers') {
        this.meters = newValue * 1000
      }
    },
    meters : function (newValue, oldValue) {
      // Vérifier s'il s'agit du champ de saisie actuel
      if (this.currentlyActiveField === 'meters') {
        this.kilometers = newValue/ 1000;
      }
    }
  }
}
vm = Vue.createApp(app).mount('#app')
vm.$watch('kilometers', function (newValue, oldValue) {
  // Ce rappel sera appelé après que vm.kilometers change
  document.getElementById ("info").innerHTML = "Valeur avant changement : " + oldValue + ", valeur après changement : " + newValue;
})
</script>

Essayez-le vous-même »

Cliquez sur le bouton « Essayez-le vous-même » pour voir l'exemple en ligne.

Dans le code ci-dessus, nous avons créé deux champs de saisie. Dans la propriété data, les valeurs initiales de kilometers et meters sont toutes deux 0. L'objet watch crée deux méthodes de surveillance pour l'objet data : kilometers et meters.

Lorsque nous saisissons des données dans le champ de saisie, watch surveillera les changements de données en temps réel et modifiera sa propre valeur. Vous pouvez regarder la démonstration vidéo ci-dessous :

Utilisation de watch dans le chargement asynchrone

Pour charger des données asynchrones, Vue fournit une méthode plus générale via l'option watch pour répondre aux changements de données.

L'exemple suivant utilise la bibliothèque axios, qui sera présentée en détail plus tard.

Exemple

<!--Comme l'écosystème des bibliothèques AJAX et des outils polyvalents est déjà assez riche, le code principal de Vue ne duplique pas-->
<!--ces fonctionnalités afin de rester léger. Cela vous permet également de choisir librement les outils qui vous sont plus familiers.-->
<script src="https://cdn.staticfile.org/axios/0.27.2/axios.min.js"></script>
<script src="https://cdn.staticfile.org/vue/3.2.37/vue.global.min.js"></script>
<script>
  const watchExampleVM = Vue.createApp({
    data() {
      return {
        question: '',
        answer: 'Chaque question doit se terminer par un point d'interrogation.'
      }
    },
    watch: {
      // Chaque fois que la question change, cette fonction s'exécutera, exigeant que la question se termine par un point d'interrogation, compatible avec le chinois et l'anglais ?
      question(newQuestion, oldQuestion) {
        if (newQuestion.indexOf('?') > -1 || newQuestion.indexOf('?') > -1) {
          this.getAnswer()
        }
      }
    },
    methods: {
      getAnswer() {
        this.answer = 'Chargement...'
        axios
          .get('/try/ajax/json_vuetest.php')
          .then(response => {
            this.answer = response.data.answer
          })
          .catch(error => {
            this.answer = 'Erreur ! Impossible d'accéder à l'API. ' + error
          })
      }
    }
  }).mount('#watch-example')
</script>

Essayez-le vous-même »

Résumé d'utilisation

watch est un mécanisme d'observation de données réactives fourni par Vue 3, qui peut observer une ou plusieurs propriétés.

Vous pouvez gérer les changements de données en passant une fonction de rappel, avec la prise en charge d'options telles que l'observation profonde et l'exécution immédiate.

1. Utilisation de base

Dans Vue 3, la fonction watch est utilisée pour observer les propriétés réactives.

Lorsque la valeur de la propriété observée change, Vue déclenche l'exécution de la fonction de rappel.

Exemple

import { reactive, watch } from 'vue';

export default {
  setup() {
    const state = reactive({
      count: 0
    });

    watch(
      () => state.count, // La propriété observée
      (newVal, oldVal) => { // La fonction de rappel lorsqu'elle change
        console.log(`count a changé de ${oldVal} à ${newVal}`);
      }
    );

    return {
      state
    };
  }
};

2. Surveillance de plusieurs propriétés réactives

Si vous souhaitez surveiller plusieurs propriétés réactives en même temps, vous pouvez passer un tableau contenant les propriétés à surveiller :

Exemple

import { reactive, watch } from 'vue';

export default {
  setup() {
    const state = reactive({
      count: 0,
      name: 'Vue3'
    });

    watch(
      [() => state.count, () => state.name], // Surveillance de plusieurs propriétés
      ([newCount, newName], [oldCount, oldName]) => {
        console.log(`count a changé de ${oldCount} à ${newCount}`);
        console.log(`name a changé de ${oldName} à ${newName}`);
      }
    );

    return {
      state
    };
  }
};

3. Surveillance profonde

Si ce que vous souhaitez surveiller est un objet ou un tableau, et que vous souhaitez surveiller ses propriétés imbriquées, vous pouvez utiliser l'optiondeep: true. Cela surveillera toutes les modifications de propriétés de l'objet.

Exemple

import { reactive, watch } from 'vue';

export default {
  setup() {
    const state = reactive({
      user: {
        name: 'Alice',
        age: 25
      }
    });

    watch(
      () => state.user, // Surveiller l'objet entier
      (newVal, oldVal) => {
        console.log('User object changed:', newVal, oldVal);
      },
      { deep: true } // Activer la surveillance profonde
    );

    return {
      state
    };
  }
};

4. Exécution immédiate

Par défaut, watch ne déclenche la fonction de rappel que lorsque la valeur surveillée change. Si vous souhaitez que la fonction de rappel s'exécute immédiatement au chargement du composant, vous pouvez définirimmediate: true。

Exemple

import { reactive, watch } from 'vue';

export default {
  setup() {
    const state = reactive({
      count: 0
    });

    watch(
      () => state.count, // Surveiller la propriété
      (newVal, oldVal) => {
        console.log(`count a changé de ${oldVal} à ${newVal}`);
      },
      { immediate: true } // Exécution immédiate
    );

    return {
      state
    };
  }
};

5. Opérations asynchrones

Si vous devez effectuer des opérations asynchrones dans watch, vous pouvez utiliser directement async et await dans la fonction de rappel, ce qui vous permet de gérer des opérations telles que les requêtes API, le stockage de données, etc.

Exemple

import { reactive, watch } from 'vue';

export default {
  setup() {
    const state = reactive({
      count: 0
    });

    watch(
      () => state.count,
      async (newVal, oldVal) => {
        console.log(`count a changé de ${oldVal} à ${newVal}`);
        // Supposons qu'une requête asynchrone soit effectuée
        await fetch(`https://api.example.com/count/${newVal}`);
      }
    );

    return {
      state
    };
  }
};

6. Surveiller plusieurs propriétés et utiliser la fonction handler

Vous pouvez également utiliser watch comme gestionnaire pour surveiller plusieurs propriétés, comme ceci :

Exemple

import { reactive, watch } from 'vue';

export default {
  setup() {
    const state = reactive({
      count: 0,
      name: 'Vue3'
    });

    const handler = ([newCount, newName], [oldCount, oldName]) => {
      console.log(`count modifié: ${oldCount} → ${newCount}`);
      console.log(`name modifié: ${oldName} → ${newName}`);
    };

    watch([() => state.count, () => state.name], handler);

    return {
      state
    };
  }
};

7. watchEffect - Surveillance simplifiée

Vue 3 fournit également l'API watchEffect, qui est plus concise que watch. Elle peut suivre automatiquement les changements dans les données réactives sans avoir besoin de spécifier une source de données spécifique.

Exemple

import { reactive, watchEffect } from 'vue';

export default {
  setup() {
    const state = reactive({
      count: 0
    });

    watchEffect(() => {
      console.log(`count est: ${state.count}`);
    });

    return {
      state
    };
  }
};

watchEffect détectera automatiquement les changements destate.countet déclenchera la fonction de rappel lorsque des changements se produisent.

8. L'option flush

L'option flush est utilisée pour contrôler le moment d'exécution des callbacks de watch.

Par défaut, les callbacks de watch s'exécutent après la mise à jour du DOM. Si vous devez exécuter le callback avant la mise à jour, vous pouvez utiliserflush: 'pre'。

Exemple

import { reactive, watch } from 'vue';

export default {
  setup() {
    const state = reactive({
      count: 0
    });

    watch(
      () => state.count,
      (newVal, oldVal) => {
        console.log(`count a changé de ${oldVal} à ${newVal}`);
      },
      { flush: 'pre' } // Exécuter le callback avant la mise à jour
    );

    return {
      state
    };
  }
};
Autres extensions