插件窝 干货文章 Vue+ElementUI表格数据渲染延迟:如何解决异步请求导致的页面数据缺失问题?

Vue+ElementUI表格数据渲染延迟:如何解决异步请求导致的页面数据缺失问题?

数据 tableData 加载 表格 217    来源:    2025-03-20

在使用 Vue.js 和 ElementUI 开发时,表格数据渲染延迟通常是由于异步请求(如 AJAX 请求)导致的。由于数据请求是异步的,页面可能在数据返回之前就已经渲染完成,导致表格数据缺失或显示为空。以下是解决这个问题的几种常见方法:

1. 使用 v-if 控制渲染时机

在表格组件上使用 v-if 指令,确保只有在数据加载完成后再渲染表格。这样可以避免在数据未加载时显示空表格。

<template>
  <div>
    <el-table v-if="dataLoaded" :data="tableData">
      <!-- 表格列定义 -->
    </el-table>
    <div v-else>加载中...</div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      tableData: [],
      dataLoaded: false
    };
  },
  async created() {
    try {
      const response = await this.fetchData();
      this.tableData = response.data;
      this.dataLoaded = true;
    } catch (error) {
      console.error('数据加载失败:', error);
    }
  },
  methods: {
    fetchData() {
      // 模拟异步请求
      return new Promise((resolve) => {
        setTimeout(() => {
          resolve({ data: [{ name: 'John', age: 30 }] });
        }, 1000);
      });
    }
  }
};
</script>

2. 使用 loading 状态

ElementUI 的 el-table 组件支持 loading 属性,可以在数据加载时显示加载动画,提升用户体验。

<template>
  <div>
    <el-table :data="tableData" v-loading="loading">
      <!-- 表格列定义 -->
    </el-table>
  </div>
</template>

<script>
export default {
  data() {
    return {
      tableData: [],
      loading: true
    };
  },
  async created() {
    try {
      const response = await this.fetchData();
      this.tableData = response.data;
    } catch (error) {
      console.error('数据加载失败:', error);
    } finally {
      this.loading = false;
    }
  },
  methods: {
    fetchData() {
      // 模拟异步请求
      return new Promise((resolve) => {
        setTimeout(() => {
          resolve({ data: [{ name: 'John', age: 30 }] });
        }, 1000);
      });
    }
  }
};
</script>

3. 使用 watch 监听数据变化

如果你需要在数据变化时动态更新表格,可以使用 watch 监听数据的变化,并在数据更新后重新渲染表格。

<template>
  <div>
    <el-table :data="tableData">
      <!-- 表格列定义 -->
    </el-table>
  </div>
</template>

<script>
export default {
  data() {
    return {
      tableData: []
    };
  },
  watch: {
    tableData(newData) {
      // 数据变化时执行的操作
      console.log('表格数据已更新:', newData);
    }
  },
  async created() {
    try {
      const response = await this.fetchData();
      this.tableData = response.data;
    } catch (error) {
      console.error('数据加载失败:', error);
    }
  },
  methods: {
    fetchData() {
      // 模拟异步请求
      return new Promise((resolve) => {
        setTimeout(() => {
          resolve({ data: [{ name: 'John', age: 30 }] });
        }, 1000);
      });
    }
  }
};
</script>

4. 使用 Skeleton 骨架屏

在数据加载时显示骨架屏,提升用户体验。ElementUI 提供了 el-skeleton 组件,可以在数据加载时显示占位符。

<template>
  <div>
    <el-skeleton :rows="6" animated v-if="loading" />
    <el-table :data="tableData" v-else>
      <!-- 表格列定义 -->
    </el-table>
  </div>
</template>

<script>
export default {
  data() {
    return {
      tableData: [],
      loading: true
    };
  },
  async created() {
    try {
      const response = await this.fetchData();
      this.tableData = response.data;
    } catch (error) {
      console.error('数据加载失败:', error);
    } finally {
      this.loading = false;
    }
  },
  methods: {
    fetchData() {
      // 模拟异步请求
      return new Promise((resolve) => {
        setTimeout(() => {
          resolve({ data: [{ name: 'John', age: 30 }] });
        }, 1000);
      });
    }
  }
};
</script>

5. 使用 async/awaitPromise 确保数据加载完成

确保在数据加载完成后再进行页面渲染。使用 async/awaitPromise 可以确保数据加载完成后再进行后续操作。

<template>
  <div>
    <el-table :data="tableData">
      <!-- 表格列定义 -->
    </el-table>
  </div>
</template>

<script>
export default {
  data() {
    return {
      tableData: []
    };
  },
  async created() {
    try {
      const response = await this.fetchData();
      this.tableData = response.data;
    } catch (error) {
      console.error('数据加载失败:', error);
    }
  },
  methods: {
    fetchData() {
      // 模拟异步请求
      return new Promise((resolve) => {
        setTimeout(() => {
          resolve({ data: [{ name: 'John', age: 30 }] });
        }, 1000);
      });
    }
  }
};
</script>

总结

通过以上方法,你可以有效解决 Vue.js 和 ElementUI 中因异步请求导致的表格数据渲染延迟问题。选择适合你项目需求的方法,确保在数据加载完成后再进行页面渲染,从而避免数据缺失或显示为空的情况。