美文网首页
2020-07-27vue H5+添加全局loading

2020-07-27vue H5+添加全局loading

作者: zsyyyyy | 来源:发表于2020-07-27 15:30 被阅读0次

    在全局App.vue

        <div v-if="$store.state.loading" class="loading">
          <van-loading type="spinner" vertical>加载中...</van-loading>
        </div>
    

    store.js

        loading: false,//loading默认值
        // 开始loading
        startLoading(state) {
          if (state.requestNum == 0) {
            state.loading = true;
          }
          state.requestNum++;
        },
        // 结束loading
        endLoading(state) {
          state.requestNum--;
          if (state.requestNum <= 0) {
            setTimeout(() => {
              state.requestNum = 0;
              state.loading = false;
            }, 100);
          }
        },
    

    现在分三种情况:
    1、每个请求都加loading
    那么我们只要在拦截器开始loading和结束loading

    service.interceptors.request.use(
      // 在发送请求之前做些什么
      config => {
        store.commit("startLoading");//请求之前开始loading
        return config;
      },
      err => {
        console.log(err);
      }
    );
    
    // http response 拦截器
    service.interceptors.response.use(
      response => {
        store.commit("endLoading"); //请求成功关闭loading
        return response;
      },
      error => {
        store.commit("endLoading");////请求失败关闭loading
        return Promise.reject(error);
      }
    );
    

    2、给需要的接口+loading,不需要的则不加(有些接口并不需要loading)
    我们可以在封装的axios添加一个是否添加loading的参数

    //预约详情
    export function detail(data) {
        return axios({
            method: 'post',
            url: '/member/appointment/detail',
            data: data,
            showLoading:true//需要loading
        })
    }
    
    export function detail(data) {
        return axios({
            method: 'post',
            url: '/member/appointment/detail',
            data: data,
            showLoading:false//不需要loading
        })
    }
    

    然后在拦截器判断即可
    如:

    service.interceptors.request.use(
      // 在发送请求之前做些什么
      config => {
       //config是一个对象,里面包含着所有的参数
        config.showLoading && store.commit("startLoading");
        return config;
      },
      err => {
        console.log(err);
      }
    );
    

    3、第三种情况就是、当我们第一次进入列表页面需要loading,随后的筛选条件并不需要
    所以我们进入列表页面的时候就直接在生命周期开始loading就行了,
    然后请求结束后关闭即可
    列表页面

      mounted() {
        this.$store.commit("startLoading");
        this.drugList();//这里面不需要+任何的loading
      }
    

    然后再拦截器请求结束结束loading即可

    // http response 拦截器
    service.interceptors.response.use(
      response => {
        store.commit("endLoading"); //请求成功关闭loading
        return response;
      },
      error => {
        store.commit("endLoading");////请求失败关闭loading
        return Promise.reject(error);
      }
    );
    

    相关文章

      网友评论

          本文标题:2020-07-27vue H5+添加全局loading

          本文链接:https://www.haomeiwen.com/subject/ydpzlktx.html