axios请求遮罩及防止用户暴力点击重复点击

<script type="text/javascript">
  // 防重复点击(指令实现)
  Vue.directive('preventReClick', {
    inserted (el, binding) {
      el.addEventListener('click', () => {
        if (!el.disabled) {
          el.disabled = true
          setTimeout(() => {
            el.disabled = false
          }, binding.value || 3000)
        }
      })
    }
  });
  let app = new Vue({
  	el: '#app',
  	data: {
  		loading:'',
  		url:'你的请求地址',
  		data:''
  	},
  	methods: {
      startLoading(){
        this.loading = this.$loading({
          lock: true,
          text: '拼命加载中...',
          spinner: 'el-icon-loading',
          background: 'rgba(255, 255, 255, 0.7)'
        });
      },
      endLoading(){
        this.loading.close();
      },
      intercept(){//axios拦截器
        //请求数据拦截器
        axios.interceptors.request.use(request => {
          this.startLoading();
          return request
        }, err => {
          return Promise.reject(err);
        });
        //接收响应拦截器
        axios.interceptors.response.use(response => {
          this.endLoading();
          return response
        }, err => {
          console.log(err)
          if (err && err.response) {
            switch (err.response.status) {
              case 400: err.message = '请求错误(400)'; break;
              case 401: this.$router.push('/login'); break;
              case 403: err.message = '拒绝访问(403)'; break;
              case 404: err.message = '请求出错(404)'; break;
              case 408: err.message = '请求超时(408)'; break;
              case 500: err.message = '服务器错误(500)'; break;
              case 501: err.message = '服务未实现(501)'; break;
              case 502: err.message = '网络错误(502)'; break;
              case 503: err.message = '服务不可用(503)'; break;
              case 504: err.message = '网络超时(504)'; break;
              case 505: err.message = 'HTTP版本不受支持(505)'; break;
              default: err.message = `连接出错(${err.response.status})!`;
            }
          } else {
            err.message = '连接服务器失败!'
          }
          this.$message.error(err.message);
          return Promise.reject(err);
        });
      },
      getData() {
        axios.get(this.url).then(res => {
          this.data = res.data
        });
      }
  	},
  	mounted() {
      //axios拦截
      this.intercept();
 	}
  });
</script>
<el-button type="primary" @click="getData()" v-prevent-re-click>请求</el-button>

这里要注意防"重复点击指令preventReClick"由于html对大小写不敏感,vue规定驼峰写法要写成横线连接,即写成"v-prevent-re-click"

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值