Vue.js 在 ajax 请求期间禁用组件

标签 vue.js vue-component vuex

我正在为以下问题寻找一个简单的解决方案:

我有一个 Vue 组件按钮,我可以用它发出 ajax 请求。我想在请求待处理时禁用此按钮(以防止多个请求)。

最佳答案

听起来您希望您的操作在开始时设置(提交)一个标志,然后在结束时清除它。

在 Vuex 中尝试这样的事情......

state: {
  loading: false
},
mutations: {
  isLoading (state) {
    state.loading = true
  },
  doneLoading (state) {
    state.loading = false
  }
},
actions: {
  doAjaxRequest ({ commit }) {
    commit('isLoading')
    return doSomeAjaxRequest().then(res => {
      // success
    }).catch(err => {
      // oh noes
    }).finally(() => {
      commit('doneLoading')
    })
  }
}

现在在您的组件中,您可以映射 loading 状态并使用它来禁用您的按钮,例如

<template>
  <button :disabled="loading" @click="doAjaxRequest">Do AJAX!</button>
</template>
<script>
  import { mapState, mapActions } from 'vuex'
  export default {
    computed: mapState(['loading']),
    methods: mapActions(['doAjaxRequest'])
  }
</script>

或者,如果您的操作返回一个 promise (如上所述),您可以在您的组件中维护请求的进度。例如,假设您的按钮有

<button :disabled="loading" @click="doTheThing">Do the thing!</button>

data () {
  return { loading: false }
},
methods: {
  doTheThing() {
    this.loading = true
    this.$store.dispatch('someAjaxActionThatReturnsAPromise').finally(() => {
      this.loading = false
    })
  }
}

关于Vue.js 在 ajax 请求期间禁用组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51967632/

相关文章:

javascript - 如何在 vue 中设置 Fabric.js?

javascript - "now"尝试更新时间时未定义

vue.js - 如何使用动态 Prop 数据动态呈现 vue 组件的新实例

css - 在 VueJS 中导入带有字体的 CSS 文件

vue.js - 一起使用 vuex-module-decorators 和 @nuxtjs/auth 时出错

javascript - 将动态数据传递给路由器链路。

javascript - CoreUI 一次只有一个下拉菜单

javascript - 如何将动态输入值绑定(bind)到 Vue.js 中的 v-for 输入字段

javascript - 如何访问在较低(父)级别声明的 Vue 对象的属性?

typescript - vue-test-utils +wrapper.vm 的 typescript 类型