当 post 请求很慢时,如何使用 axios 在 Vuejs 中更改数据 属性?

How to change data property in Vuejs using axios when a post request is slow?

我有一个登录页面,在我的模板中有一个 <p v-show="loading">Loading...</p>

假设 post 请求没有错误并且很慢,那么我想在处理请求时将加载 属性 更改为 true。我怎样才能在下面的脚本中做到这一点?

*Edit* Added the template code

<template>
  <div id="backend-view">
    <form @submit.prevent="submit">
      <p v-show="loading">Loading...</p>
      <h3>Login Here</h3>
      <label for="email">Email</label>
      <input type="text" id="email" v-model="fields.email" />
      <span v-if="errors && errors.email" class="error">{{
        errors.email[0]
      }}</span>

      <label for="password">Password</label>
      <input type="password" id="password" v-model="fields.password" />
      <span v-if="errors && errors.password" class="error">{{
        errors.password[0]
      }}</span>
      <button type="submit">Log In</button>
    </form>
  </div>
</template>

<script>
export default {
  data() {
    return {
      fields: {},
      errors: {},
      loading: false
    };
  },
  methods: {
    submit() {
      axios
        .post("/api/login", this.fields)
        .then((res) => {
          if (res.status == 201) {
            this.$router.push("/dashboard");
          }
        })
        .catch((error) => {
          if (error.response.status == 422) {
            this.errors = error.response.data.errors;
          }
        });
    },
  },
};
</script>

像这样:

<script>
export default {
 data() {
   return {
    fields: {},
    errors: {},
    loading: false
   };
 },
 methods: {
  submit() {
    this.loading = true
    axios
    .post("/api/login", this.fields)
    .then((res) => {
        this.loading = false
      if (res.status == 201) {
        this.$router.push("/dashboard");
      }
    })
    .catch((error) => {
      if (error.response.status == 422) {
        this.errors = error.response.data.errors;
      }
    });
  },
 },
 };

您可以在调用 api 之前设置一个计时器,然后切换并加载消失。

<script>

    export default {
     data() {
       return {
        fields: {},
        errors: {},
        loading: false
       };
     },
     methods: {
      submit() {
        this.loading = true
        setTimeout(function(){ 
            this.loading = false 
        }, 2000);
        axios
        .post("/api/login", this.fields)
        .then((res) => {
          if (res.status == 201) {
            this.$router.push("/dashboard");
          }
        })
        .catch((error) => {
          if (error.response.status == 422) {
            this.errors = error.response.data.errors;
          }
        });
      },
     },
    };
</script>

Observation/Suggestion : 在调用 API 提交表单数据之前,您应该根据要求验证表单数据,如果验证通过然后只拨打 API 电话。

现在根据 的回答,我想在处理请求时将加载 属性 更改为 true

除了上述建议,您可以在提交时 this.loading = true,然后在 API 回复时您可以 this.loading = false

submit() {
  this.loading = true;
  axios
    .post("/api/login", this.fields)
    .then((res) => {
    this.loading = false;
    if (res.status == 201) {
      this.$router.push("/dashboard");
    }
  })
    .catch((error) => {
    this.loading = false;
    if (error.response.status == 422) {
      this.errors = error.response.data.errors;
    }
  });
}

按如下方式使用async/await。当您在后端处理错误时,此解决方案是完美的。

  methods: {
    async submit() {
      this.loading = true;
      try{
        const res = await axios
          .post("/api/login", this.fields);
        if (res.status == 201) {
           this.$router.push("/dashboard");
        }
      }catch(error){
          if (error.response.status == 422) {
            this.errors = error.response.data.errors;
          }
      };
      this.loading = false;
    },
  },