vue单页面的数据请求添加loading效果

该博客介绍了如何在Vue单页面应用中实现数据请求时的loading效果。通过在app.vue引入loading组件,并结合store.js和request.js进行配置,利用axios的拦截器功能,无论请求在何处发起,都能统一管理加载状态。

1、在app.vue,先引入你的loading组件

app.vue

<template>
  <div id="app">
    <router-view/>
    <div class="load_cover" v-if="showLoading">
      <!-- <van-loading /> -->
      <van-loading color="red"/>
      <!-- <van-loading type="spinner" /> -->
      <!-- <van-loading type="spinner" color="white" /> -->
    </div>
  </div>
</template>

<script>
// 引入vuex的辅助方法
import { mapState } from 'vuex'
import Vue from 'vue'
// 引入loading插件,自己的也可以哦,直接在组件上判断显示隐藏即可
import { Loading } from 'vant'
Vue.use(Loading)
export default {
  // computed: mapState({
  //   showLoading: (state) => state.showLoading
  // })
  computed: {
    ...mapState([
      'showLoading'
    ])
  }
}
</script>

<style>
.van-loading__circular circle{
  stroke-width: 5px;
}
.van-loading{
  width: 40px;
  height: 40px;
  top: 40%;
  left: 50%;
  transform: translateX(-50%)
}
.load_cover{
  width: 100%;
  height: 100%;
  background: rgba(255,255,255,.5);
  z-index: 999;
  position: fixed;
  left: 0;
  top:0;
}
*{
  padding: 0;
  margin: 0;
}
html,body{
  width: 100%;
}
</style>

store.js

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    openId: '',
    code: '',
    showLoading: true
  },
  mutations: {
    updateLoading (state, showLoading) {
      state.showLoading = showLoading
    }
  }
})

request.js
这里我是把axios单独的抽出来了,如果你在main.js里,直接在main.js引入拦截器也是一样的

import store from '../store/store'
import axios from 'axios'

const service = axios.create({
  baseURL: 'http://666.6666666.666'
})

service.interceptors.request.use((config) => {
  store.commit('updateLoading', true)
  return config
}, (err) => {
  return Promise.reject(err)
})
service.interceptors.response.use((response) => {
  store.commit('updateLoading', false)
  if (response.status === 200) {
    return response.data
  } else {
    return {code: -2}
  }
}, (err) => {
  return Promise.reject(err)
})
export default service

over警告~

<think>好的,我需要帮助用户在Vue3项目中用Element Plus实现页面加载时的Loading遮罩层,并在加载完成后隐藏。首先,我得回忆一下Element Plus的Loading组件使用方法。根据之前的引用,ElLoading是一个服务,可以通过导入后调用方法来显示和隐藏加载动画。用户的需求是在页面加载时显示遮罩层,加载完成后隐藏。这意味着需要在组件的挂载阶段触发显示Loading,然后在数据加载或异步操作完成后关闭。可能需要使用Vue3的生命周期钩子,比如onMounted,以及异步函数。 接下来,我应该考虑如何正确导入ElLoading。用户需要在组件中引入它,然后调用ElLoading.service()来启动加载。同时,要确保在加载完成后调用返回实例的close方法。可能需要将加载逻辑放在异步函数中,使用async/await来处理数据获取,这样可以在Promise解决后关闭Loading。另外,用户可能希望全局封装这个功能,以便在多个组件中复用。这时候可以考虑使用自定义Hook或者高阶组件。例如,创建一个usePageLoading函数,内部处理Loading的显示和隐藏,并返回相关的方法。这样不同的页面组件都可以调用这个Hook来统一管理Loading状态。 还需要注意Loading的配置选项,比如是否全屏、加载文字、背景颜色等。用户可能需要自定义这些参数,所以应该提供配置的灵活性。例如,可以允许传递target来指定Loading覆盖的DOM元素,或者设置lock来防止滚动。测试时,要确保Loading在组件挂载时立即显示,并且在数据加载完成后正确关闭。可能需要模拟异步请求,比如使用setTimeout或者实际的API调用,来验证Loading的行为是否符合预期。最后,要避免常见的错误,比如在组件卸载时没有关闭Loading,导致遮罩层残留。因此,在onUnmounted生命周期中,应该检查是否有未关闭的Loading实例并关闭它们。总结步骤:导入ElLoading,在onMounted中调用service显示,在异步操作完成后调用close,处理错误情况,封装成可复用的Hook,配置合适的参数,并处理组件卸载时的清理工作。</think>在Vue3中使用Element Plus实现页面加载时显示Loading遮罩层,可以通过以下步骤实现: ### 一、基础实现步骤 1. **安装Element Plus** ```bash npm install element-plus ``` 2. **全局引入Loading服务** ```typescript // main.ts import { createApp } from 'vue' import ElementPlus from 'element-plus' import 'element-plus/dist/index.css' const app = createApp(App) app.use(ElementPlus) ``` 3. **组件内实现逻辑** ```vue <script setup> import { ElLoading } from 'element-plus' import { onMounted } from 'vue' let loadingInstance: ReturnType<typeof ElLoading.service> onMounted(async () => { // 启动全屏加载 loadingInstance = ElLoading.service({ lock: true, text: '拼命加载中...', background: 'rgba(0, 0, 0, 0.7)' }) try { // 模拟异步请求 await fetchData() } finally { // 关闭加载 loadingInstance.close() } }) </script> ``` ### 二、高阶封装方案(推荐) ```typescript // utils/loading.ts import { ElLoading } from 'element-plus' export function usePageLoading(options = {}) { let loadingInstance: ReturnType<typeof ElLoading.service> const open = () => { loadingInstance = ElLoading.service({ lock: true, text: '加载中...', background: 'rgba(0, 0, 0, 0.5)', ...options }) } const close = () => { loadingInstance?.close() } return { open, close } } ``` ```vue <script setup> import { usePageLoading } from '@/utils/loading' import { onMounted } from 'vue' const { open, close } = usePageLoading() onMounted(async () => { open() try { await Promise.all([fetchData(), loadResources()]) } finally { close() } }) </script> ``` ### 三、关键配置参数说明 | 参数 | 说明 | 类型 | 默认值 | |------------|--------------------------|---------|--------------| | lock | 是否锁定滚动 | boolean | true | | text | 加载文字 | string | '加载中' | | background | 遮罩背景色 | string | rgba(0,0,0,0.5) | | target | 指定加载覆盖的DOM元素 | string | document.body | | fullscreen | 是否全屏 | boolean | true | ### 四、最佳实践建议 1. **错误处理** 在finally块中关闭loading,确保无论请求成功与否都会执行关闭操作 2. **多请求场景** 使用`Promise.all()`处理并行请求,避免单个请求完成就关闭loading 3. **局部加载** ```typescript // 指定特定容器 const { open } = usePageLoading({ target: '#table-container', fullscreen: false }) ``` 4. **组件卸载处理** ```typescript import { onUnmounted } from 'vue' onUnmounted(() => { close() }) ``` ### 五、常见问题排查 1. **Loading未关闭** 检查异步操作是否抛出未捕获的异常,建议在catch块中处理错误后再throw 2. **样式不生效** 确保已正确引入Element Plus的样式文件 3. **局部加载位置偏移** 检查target元素的position属性是否为relative/absolute/fixed
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值