43、接口请求需要时间,导致页面初始加载时会出现空白,影响用户体验

1. 显示加载状态

在接口请求数据的过程中,显示一个加载状态提示,让用户知道页面正在加载数据。

示例代码

vue

复制代码
<template>
  <div>
    <!-- 显示加载状态 -->
    <div v-if="isLoading">
      <p>正在加载数据,请稍候...</p>
    </div>
    <!-- 数据加载完成后显示动态组件 -->
    <component v-else :is="currentComponent" :data="componentData"></component>
  </div>
</template>

<script>
export default {
  data() {
    return {
      isLoading: true,
      currentComponent: null,
      componentData: null
    };
  },
  mounted() {
    this.fetchData();
  },
  methods: {
    async fetchData() {
      try {
        // 模拟接口请求
        const response = await this.$axios.get('/api/data');
        const { componentName, data } = response.data;
        this.currentComponent = componentName;
        this.componentData = data;
      } catch (error) {
        console.error('数据请求失败:', error);
      } finally {
        this.isLoading = false;
      }
    }
  }
};
</script>

2. 预加载组件

在页面加载之前,提前加载一些常用的组件,减少组件加载的时间。

示例代码

javascript

复制代码
// main.js
import Vue from 'vue';
import App from './App.vue';
// 预加载组件
import ComponentA from './components/ComponentA.vue';
import ComponentB from './components/ComponentB.vue';

Vue.component('ComponentA', ComponentA);
Vue.component('ComponentB', ComponentB);

new Vue({
  render: h => h(App)
}).$mount('#app');

3. 骨架屏

骨架屏是一种在数据加载过程中显示的占位布局,它模拟了页面的基本结构,让用户对页面内容有一个初步的了解。

示例代码

vue

复制代码
<template>
  <div>
    <!-- 骨架屏 -->
    <div v-if="isLoading" class="skeleton-screen">
      <!-- 这里可以根据页面结构设计骨架屏样式 -->
      <div class="skeleton-item"></div>
      <div class="skeleton-item"></div>
    </div>
    <!-- 数据加载完成后显示动态组件 -->
    <component v-else :is="currentComponent" :data="componentData"></component>
  </div>
</template>

<script>
export default {
  data() {
    return {
      isLoading: true,
      currentComponent: null,
      componentData: null
    };
  },
  mounted() {
    this.fetchData();
  },
  methods: {
    async fetchData() {
      try {
        // 模拟接口请求
        const response = await this.$axios.get('/api/data');
        const { componentName, data } = response.data;
        this.currentComponent = componentName;
        this.componentData = data;
      } catch (error) {
        console.error('数据请求失败:', error);
      } finally {
        this.isLoading = false;
      }
    }
  }
};
</script>

<style scoped>
.skeleton-screen {
  display: flex;
  flex-direction: column;
}

.skeleton-item {
  width: 100%;
  height: 20px;
  background-color: #f0f0f0;
  margin-bottom: 10px;
  border-radius: 4px;
}
</style>

4. 缓存数据

如果接口数据在短时间内不会发生变化,可以将数据缓存起来,下次进入页面时直接使用缓存数据,减少接口请求时间。

示例代码

javascript

复制代码
// 缓存数据
const cache = {};

export default {
  data() {
    return {
      isLoading: true,
      currentComponent: null,
      componentData: null
    };
  },
  mounted() {
    const cachedData = cache['api/data'];
    if (cachedData) {
      const { componentName, data } = cachedData;
      this.currentComponent = componentName;
      this.componentData = data;
      this.isLoading = false;
    } else {
      this.fetchData();
    }
  },
  methods: {
    async fetchData() {
      try {
        // 模拟接口请求
        const response = await this.$axios.get('/api/data');
        const { componentName, data } = response.data;
        this.currentComponent = componentName;
        this.componentData = data;
        // 缓存数据
        cache['api/data'] = { componentName, data };
      } catch (error) {
        console.error('数据请求失败:', error);
      } finally {
        this.isLoading = false;
      }
    }
  }
};

通过以上方法,可以有效改善页面初始加载时的空白问题,提升用户体验。你可以根据实际需求选择合适的方法。

相关推荐
尾善爱看海4 小时前
Vue 面试收官篇:SSR、性能优化落地、30 道高频面试题精讲(附标准答案)
前端·javascript·vue.js·面试·vue
weixin_BYSJ19874 小时前
【计算机毕设】基于SpringBoot与Vue的文物保护档案管理系统08621
vue.js·spring boot·spring cloud·微服务·架构·django·课程设计
Bs_MoneyMagnet5 小时前
基于springboot+vue的个人健康管理系统的设计与实现 源码+文档
java·vue.js·spring boot·后端·vue3·springboot3·计算机毕业设计
Bs_MoneyMagnet7 小时前
基于springboot+vue的心理咨询预约与随访平台的设计与实现 源码+文档
vue.js·spring boot·后端·spring·毕业设计·旅游·计算机毕业设计
李明卫杭州9 小时前
React 复合事件系统对比解析
前端·javascript·react.js
行者全栈架构师10 小时前
Spring Boot 接入 MaxKey 单点登录:6 个内部系统,一次登录全通行
java·vue.js·后端
万敏10 小时前
Vue3 全栈实战第九周:Node.js + Express 后端从零搭建实战记录
vue.js·node.js·全栈
LEE10 小时前
前端转型全栈 01:数据建模,前端最大的盲区
前端·javascript·后端
雪芽蓝域zzs10 小时前
第四十七节:驾驶舱大屏 ECharts 图表集成
前端·javascript·vue.js
梦醒沉醉12 小时前
7、表达日期和时间(前朝遗老Date)
javascript