web-dev-qa-db-fra.com

Vue: Afficher le chargeur lorsque la demande est en cours

Je veux implémenter un processus comme ci-dessous:

Lorsqu'une demande http est en cours, affichez un chargeur. Une fois les requêtes terminées, masquez le chargeur.

7
Sarina

Je ne sais pas si je vous comprends, mais je suppose que vous voulez un chargeur lorsqu'une demande http est en cours, je vais donc montrer la logique.J'espère comprendre

<template>

    <div>

        <div v-if="loading">
            <!-- here put a spinner or whatever you want to do when request is on proccess -->
        </div>

        <div v-if="!loading">
            <!-- here is your application code -->
        </div>

    </div>

</template>

<script>
    import axios from 'axios'
    export default {
        data() {
            return {
                loading: false
            }
        },
        methods: {
            makeRequest () {
                this.loading = true //the loading begin
                axios.get('/example')
                .then(response => {
                    this.loading = false //the loading stop when the response given from server
                    //do whatever with response
                })
                .catch(error => {
                    this.loading = false
                    //do whatever with response
                })
            }
        }
    }
</script>

J'espère que vous comprenez. Pour plus d'informations, pour l'envoi d'une demande http, j'utilise axios et j'utilise également v-if dans les deux cas, mais dans le deuxième div, vous pouvez utiliser v-else

13
roli roli

Uniquement pour les utilisateurs de Nuxt.js

l'exemple écrit par roli est excellent, mais idéalement vous ne voulez pas vous répéter à chaque demande que vous faites. donc je vous suggère de faire comme ça grâce à: https://stackoverflow.com/a/58084093/1031297

Ajoutez ['@ nuxtjs/axios'] ....

Ajouter ou modifier plugins/axios.js

export default ({ app, $axios ,store }) => {      
  $axios.interceptors.request.use((config) => {
    store.commit("SET_DATA", { data:true, id: "loading" });
    return config;
  }, (error) => {
    return Promise.reject(error);
  });

  $axios.interceptors.response.use((response) => {
    store.commit("SET_DATA", { data:false, id: "loading" });
    return response;
  }, (error) => {
    return Promise.reject(error);
  });
}

avec le magasin étant

export default {
  state: () => ({
    loading: false
  }),
  mutations: {
    SET_DATA(state, { id, data }) {
      state[id] = data
    }
  },
  actions: {

  }
}
0
OWADVL