Vue3 + Element Plus项目实战:从后端API加载到el-table展示,如何优雅处理‘暂无数据’和‘加载中’状态?
2026/5/1 18:12:24 网站建设 项目流程

Vue3 + Element Plus实战:el-table数据加载状态管理的艺术

管理后台开发中最常见的场景莫过于表格数据展示。当用户点击某个菜单项,期待看到整齐排列的业务数据时,作为开发者的我们需要处理各种可能的状态:数据正在加载时的等待提示、成功获取但数据为空时的友好展示、数据加载失败时的错误处理,以及最终数据成功渲染的完美呈现。这些状态看似简单,却直接影响用户体验的流畅度。

1. 数据加载生命周期与状态管理

现代前端应用的数据加载是一个典型的异步过程。从用户触发操作到最终数据呈现,整个过程可以分解为几个关键阶段:

  1. 初始化状态:组件挂载,准备发起请求
  2. 加载中状态:请求已发出,等待响应
  3. 成功状态:数据返回,可能包含数据或为空
  4. 错误状态:请求失败,需要处理异常

在Vue3组合式API中,我们可以使用ref或reactive来管理这些状态:

const tableState = reactive({ isLoading: false, data: [], error: null, isEmpty: computed(() => tableState.data.length === 0) })

这种集中式的状态管理让我们的代码更加清晰,也便于在不同组件间共享状态。对于更复杂的场景,可以考虑使用Pinia进行全局状态管理。

2. Element Plus的el-table状态展示方案

Element Plus提供了多种方式来处理表格的空状态,每种方式适用于不同的场景:

2.1 empty-text属性:简单快速的解决方案

empty-text是el-table最基础的空状态提示方式,只需一个简单的属性:

<el-table :data="tableData" empty-text="暂无相关数据" />

适用场景

  • 简单的静态提示文本
  • 不需要复杂样式或交互的空状态展示
  • 快速原型开发阶段

局限性

  • 无法自定义样式和布局
  • 不能根据不同的空状态原因显示不同内容
  • 无法添加交互元素如图片、按钮等

2.2 #empty插槽:灵活定制的终极方案

当需要高度定制空状态展示时,#empty插槽是不二之选:

<el-table :data="tableData"> <template #empty> <div class="custom-empty"> <img src="@/assets/no-data.svg" /> <p>没有找到您需要的数据</p> <el-button type="primary" @click="refresh">刷新试试</el-button> </div> </template> </el-table>

优势对比

特性empty-text#empty插槽
自定义HTML
支持图片
支持交互元素
条件渲染不同状态
样式控制自由度

3. 实战:构建智能表格状态组件

让我们构建一个可复用的智能表格组件,它能够自动处理各种状态:

// SmartTable.vue <script setup> import { ref, computed } from 'vue' const props = defineProps({ data: Array, loading: Boolean, error: Error }) const isEmpty = computed(() => !props.loading && props.data?.length === 0) </script> <template> <el-table :data="data"> <template #empty> <div class="state-container"> <div v-if="loading" class="loading-state"> <el-icon class="is-loading"><Loading /></el-icon> <span>数据加载中...</span> </div> <div v-else-if="error" class="error-state"> <el-icon><Warning /></el-icon> <span>数据加载失败: {{ error.message }}</span> <el-button @click="$emit('retry')">重试</el-button> </div> <div v-else-if="isEmpty" class="empty-state"> <img src="@/assets/no-data.svg" /> <p>暂无数据</p> </div> </div> </template> <slot></slot> </el-table> </template>

这个组件可以这样使用:

<SmartTable :data="tableData" :loading="isLoading" :error="error" @retry="fetchData" > <el-table-column prop="name" label="姓名" /> <el-table-column prop="age" label="年龄" /> </SmartTable>

4. 高级技巧与性能优化

4.1 分页场景下的状态处理

分页表格需要特殊处理空状态,特别是当用户切换到某一页没有数据时:

const handlePageChange = async (page) => { try { state.isLoading = true const res = await fetchData({ page }) if (res.data.length === 0 && page > 1) { // 如果非第一页无数据,自动返回上一页 state.pagination.currentPage-- await handlePageChange(state.pagination.currentPage) } else { state.tableData = res.data } } finally { state.isLoading = false } }

4.2 骨架屏加载效果

为了更好的用户体验,可以使用骨架屏替代简单的加载中文字:

<template #empty> <div v-if="loading" class="skeleton-container"> <el-skeleton v-for="i in 5" :key="i" animated> <template #template> <el-skeleton-item variant="text" style="width: 100%" /> </template> </el-skeleton> </div> <!-- 其他状态展示 --> </template>

4.3 全局状态组件注册

对于大型项目,可以注册全局表格状态组件:

// main.js import TableEmptyState from '@/components/TableEmptyState.vue' app.component('TableEmptyState', TableEmptyState)

然后在任何el-table中使用:

<el-table> <template #empty> <TableEmptyState :loading="isLoading" :error="error" @retry="fetchData" /> </template> </el-table>

表格状态管理看似简单,实则是前端工程中不可忽视的重要环节。一个精心设计的表格状态系统能够显著提升用户体验,减少用户困惑,使应用显得更加专业和可靠。在实际项目中,我倾向于使用组合式API配合插槽系统,创建灵活可复用的表格组件,这样既能保持代码整洁,又能满足各种复杂场景的需求。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询