导读:本期聚焦于小伙伴创作的《Element UI中el-table数据加载状态优化方案:三种方法实现"数据加载中"提示》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《Element UI中el-table数据加载状态优化方案:三种方法实现"数据加载中"提示》有用,将其分享出去将是对创作者最好的鼓励。

el-table空数组显示“数据加载中”的解决方案

在使用Element UI的el-table组件时,很多开发者会遇到数据初始化为空数组时,表格直接显示“暂无数据”的提示,但实际场景中可能需要先展示“数据加载中”的状态,等待异步请求完成后再切换显示内容。本文将介绍几种可行的实现方案,帮助开发者解决该问题。

问题场景说明

通常我们在组件初始化时,会先定义表格绑定的数据源为一个空数组,然后在created或mounted生命周期中发起异步请求获取表格数据。此时el-table在数据为空数组时,默认会显示“暂无数据”的提示,而不是我们期望的“数据加载中”状态,导致用户体验不佳。

方案一:通过加载状态变量控制显示

这是最常用也最灵活的实现方式,通过增加一个表示数据加载状态的变量,结合条件渲染来控制表格区域或提示内容的显示。

步骤说明

  • 在data中定义表格数据源tableData和加载状态变量loading,初始时loading设为true

  • 发起异步请求获取数据时,保持loading为true,请求完成后根据结果更新tableData,再将loading设为false

  • 在模板中使用v-if和v-else条件渲染,loading为true时显示“数据加载中”提示,否则渲染el-table

代码示例

<template>
  <div class="table-container">
    <div v-if="loading" class="loading-tip">数据加载中...</div>
    <el-table
      v-else
      :data="tableData"
      border
      style="width: 100%"
    >
      <el-table-column
        prop="name"
        label="姓名"
        width="180"
      ></el-table-column>
      <el-table-column
        prop="age"
        label="年龄"
        width="180"
      ></el-table-column>
      <el-table-column
        prop="address"
        label="地址"
      ></el-table-column>
    </el-table>
  </div>
</template>

<script>
export default {
  data() {
    return {
      tableData: [],
      loading: true
    }
  },
  created() {
    this.fetchTableData()
  },
  methods: {
    fetchTableData() {
      // 模拟异步请求
      setTimeout(() => {
        // 假设请求成功返回数据
        this.tableData = [
          { name: '张三', age: 20, address: '北京市朝阳区' },
          { name: '李四', age: 22, address: '上海市浦东新区' }
        ]
        this.loading = false
      }, 1500)
    }
  }
}
</script>

<style scoped>
.loading-tip {
  text-align: center;
  padding: 30px;
  color: #909399;
  font-size: 14px;
}
</style>

方案二:利用el-table的empty插槽自定义空状态

如果希望在表格内部处理空状态,不额外增加外层容器,可以使用el-table提供的empty插槽,根据加载状态自定义空状态的显示内容。

步骤说明

  • 同样在data中定义loading和tableData变量,初始loading为true

  • 使用el-table的empty插槽,在插槽内部根据loading状态判断显示内容:loading为true时显示“数据加载中”,否则显示默认的“暂无数据”

  • 异步请求完成后更新tableData和loading状态即可

代码示例

<template>
  <div>
    <el-table
      :data="tableData"
      border
      style="width: 100%"
    >
      <el-table-column
        prop="name"
        label="姓名"
        width="180"
      ></el-table-column>
      <el-table-column
        prop="age"
        label="年龄"
        width="180"
      ></el-table-column>
      <el-table-column
        prop="address"
        label="地址"
      ></el-table-column>
      <template #empty>
        <div class="empty-content">
          <span v-if="loading">数据加载中...</span>
          <span v-else>暂无数据</span>
        </div>
      </template>
    </el-table>
  </div>
</template>

<script>
export default {
  data() {
    return {
      tableData: [],
      loading: true
    }
  },
  created() {
    this.fetchTableData()
  },
  methods: {
    fetchTableData() {
      // 模拟异步请求
      setTimeout(() => {
        // 请求失败的场景示例,保持tableData为空数组
        // this.tableData = []
        // 请求成功的场景示例
        this.tableData = [
          { name: '王五', age: 25, address: '广州市天河区' }
        ]
        this.loading = false
      }, 1500)
    }
  }
}
</script>

<style scoped>
.empty-content {
  padding: 30px;
  color: #909399;
  font-size: 14px;
}
</style>

方案三:结合el-loading指令实现加载遮罩

如果希望保留表格结构,仅在表格区域显示加载遮罩,同时提示“数据加载中”,可以使用Element UI的el-loading指令,在表格容器上添加加载遮罩。

步骤说明

  • 在data中定义loading变量,初始为true

  • 在el-table的外层容器上添加v-loading指令,绑定loading变量,同时可以自定义加载文案

  • 异步请求完成后将loading设为false即可关闭遮罩

代码示例

<template>
  <div
    v-loading="loading"
    element-loading-text="数据加载中..."
    style="min-height: 200px;"
  >
    <el-table
      :data="tableData"
      border
      style="width: 100%"
    >
      <el-table-column
        prop="name"
        label="姓名"
        width="180"
      ></el-table-column>
      <el-table-column
        prop="age"
        label="年龄"
        width="180"
      ></el-table-column>
      <el-table-column
        prop="address"
        label="地址"
      ></el-table-column>
    </el-table>
  </div>
</template>

<script>
export default {
  data() {
    return {
      tableData: [],
      loading: true
    }
  },
  created() {
    this.fetchTableData()
  },
  methods: {
    fetchTableData() {
      // 模拟异步请求
      setTimeout(() => {
        this.tableData = [
          { name: '赵六', age: 28, address: '深圳市南山区' }
        ]
        this.loading = false
      }, 1500)
    }
  }
}
</script>

方案对比与选择建议

方案优点缺点适用场景
方案一:加载状态变量控制显示逻辑清晰,可自定义内容样式灵活,完全掌控显示状态需要额外增加条件渲染的容器,切换时可能有轻微闪烁需要完全自定义加载和空状态的显示内容,对样式要求高的场景
方案二:empty插槽自定义无需额外外层容器,在表格内部处理,结构更简洁仅能替换表格空状态的内容,无法在表格有数据时显示加载状态仅需要在表格数据为空时区分加载中和无数据的场景
方案三:el-loading指令遮罩保留表格原有结构,加载遮罩样式统一,实现简单加载提示样式受el-loading限制,自定义程度较低希望快速实现加载效果,且接受Element UI默认加载样式的场景

注意事项

  • 异步请求完成后,无论成功失败都需要将loading状态设为false,避免出现一直显示“数据加载中”的问题

  • 如果请求失败且不需要重试,建议将loading设为false后,保持tableData为空数组,此时可根据业务需求显示“加载失败”或“暂无数据”的提示

  • 使用empty插槽时,需要注意el-table的empty插槽在Vue2和Vue3中的写法略有差异,上述示例为Vue3的写法,Vue2中需要使用slot="empty"的写法

以上就是解决el-table空数组显示“数据加载中”的几种常用方案,开发者可以根据实际业务需求选择合适的实现方式,提升用户的使用体验。

el-table ElementUI 数据加载 空状态 表格优化

免责声明:已尽一切努力确保本网站所含信息的准确性。网站部分内容来源于网络或由用户自行发表,内容观点不代表本站立场。本站是个人网站免费分享,内容仅供个人学习、研究或参考使用,如内容中引用了第三方作品,其版权归原作者所有。若内容触犯了您的权益,请联系我们进行处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。前端、网络、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握网站开发与运维所需的核心技术栈。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端逻辑,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。