Vue+antd中关于发送请求时候的Loading遮罩层闪烁无法覆盖问题

本文介绍了一种在Vue项目中优化加载层显示的方法。通过在App.vue中设置全局加载层,并针对Modal弹窗内的请求单独控制加载层显示,解决了Modal层级覆盖导致的加载层遮罩问题。文章详细阐述了如何利用Vuex状态管理和Axios请求拦截来实现这一优化。

需求:在发送请求的时候需要给全局加loading样式,初步实现在App.vue中直接包裹整个router-view,然后监听vuex中的值,值在封装axios的时候,即请求拦截以及响应请求的时候改变

App.vue

    <div id="app">
      <a-spin :spinning="LOADING_PAGE" size="large">
        <router-view />
      </a-spin>
    </div>
  setup() {
    const store = useStore();
    const LOADING_PAGE = computed(() => {
      return store.getters.LOADING_PAGE;
    });
    return { LOADING_PAGE};
  },

request.ts

// 请求拦截
service.interceptors.request.use((config) => {
    store.commit("MDF_LOADING_PAGE", true);
}
// 响应拦截(以及失败也要更改MDF_LOADING_PAGE)
service.interceptors.response.use((response) => {
	store.commit("MDF_LOADING_PAGE", false);
}

问题:如果在Modal中也有table列表请求的时候,Modal的层级可能会覆盖loading
所以我们需要两个loading,分别用在全局和Modal中,然后我们写两个值分别控制这个loading样式,然后在Modal中就不需要全局的loading,我们在request.ts更改一下即可

// 请求拦截
service.interceptors.request.use((config) => {
   if (!store.getters.LOADING_MODAL) {
    store.commit("MDF_LOADING_PAGE", true);
  }
}
// 响应拦截(以及失败也要更改MDF_LOADING_PAGE)
service.interceptors.response.use((response) => {
	store.commit("MDF_LOADING_PAGE", false);
	store.commit("MDF_LOADING_MODAL", false);
}

Modal页面

  <a-spin :spinning="LOADING_MODAL" size="large">
	...
  </a-spin>
  setup() {
    const store = useStore();
    const LOADING_MODAL= computed(() => {
      return store.getters.LOADING_MODAL;
    });
    return { LOADING_MODAL};
  },
在前端使用VueAntD和Axios访问后端四个API,可参考以下步骤及示例代码。 ### 1. 项目初始化与依赖安装 确保已安装VueAntD,若未安装,可通过以下命令创建Vue项目并安装AntD和Axios: ```bash npm init vite@latest my-vue-app -- --template vue cd my-vue-app npm install antd axios ``` ### 2. 引入AntD组件和Axios 在 `main.js`(Vue 2)或 `main.ts`(Vue 3)中引入AntD组件和CSS文件,同时可配置Axios: ```javascript // main.js (Vue 2) import Vue from 'vue'; import App from './App.vue'; import { Button, Card } from 'ant-design-vue'; import 'ant-design-vue/dist/antd.css'; import axios from 'axios'; Vue.use(Button); Vue.use(Card); Vue.prototype.$axios = axios; Vue.config.productionTip = false; new Vue({ render: h => h(App), }).$mount('#app'); ``` ```javascript // main.ts (Vue 3) import { createApp } from 'vue'; import App from './App.vue'; import Antd from 'antd'; import 'antd/dist/antd.css'; import axios from 'axios'; const app = createApp(App); app.use(Antd); app.config.globalProperties.$axios = axios; app.mount('#app'); ``` ### 3. 编写访问API的代码 在组件中使用Axios访问后端的四个API,以下是一个示例: ```vue <template> <div> <a-button @click="fetchData">Fetch Data</a-button> <a-card v-if="data1" title="API 1 Data">{{ data1 }}</a-card> <a-card v-if="data2" title="API 2 Data">{{ data2 }}</a-card> <a-card v-if="data3" title="API 3 Data">{{ data3 }}</a-card> <a-card v-if="data4" title="API 4 Data">{{ data4 }}</a-card> </div> </template> <script setup> import { ref } from 'vue'; const data1 = ref(null); const data2 = ref(null); const data3 = ref(null); const data4 = ref(null); const fetchData = async () => { try { const response1 = await this.$axios.get('http://backend-api-url/api1'); data1.value = response1.data; const response2 = await this.$axios.get('http://backend-api-url/api2'); data2.value = response2.data; const response3 = await this.$axios.get('http://backend-api-url/api3'); data3.value = response3.data; const response4 = await this.$axios.get('http://backend-api-url/api4'); data4.value = response4.data; } catch (error) { console.error('Error fetching data:', error); } }; </script> ``` ### 4. 错误处理与优化 在实际应用中,需要对API请求进行错误处理,可使用 `try...catch` 语句捕获异常。同时,可添加加载状态和重试机制等优化措施。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值