首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

前端如何处理后端一次性返回10万条数据?

编程知识
2024年07月28日 12:34

在前端开发中,我们经常需要处理后端返回的大量数据。假设后端一次性返回10万条数据,直接在浏览器中处理和展示这些数据会导致性能问题,比如页面卡顿、内存占用过高等。本文将结合Vue项目实战,介绍如何有效地处理和展示大数据集的方法。

1. 后端数据处理

首先,确保后端在传输数据时是经过压缩的,可以大大减少传输的数据量。常见的压缩方式有Gzip或Brotli。

// 在Node.js中使用compression中间件
const compression = require('compression');
const express = require('express');
const app = express();

app.use(compression());

 

 

2. 前端数据处理

分页加载

分页加载是最常用的方法之一,通过每次只加载一部分数据,可以有效减少浏览器的内存压力和渲染时间。

后端分页接口

后端需要提供分页接口,每次只返回一部分数据。

// 例如,在Express中实现分页接口
app.get('/data', (req, res) => {
    const page = parseInt(req.query.page) || 1;
    const pageSize = parseInt(req.query.pageSize) || 100;
    const data = getData(); // 获取所有数据的函数
    const paginatedData = data.slice((page - 1) * pageSize, page * pageSize);
    res.json(paginatedData);
});

 

前端分页实现

在Vue项目中,使用axios进行数据请求,并实现分页加载。

<template>
  <div>
    <table>
      <tr v-for="item in items" :key="item.id">
        <td>{{ item.name }}</td>
        <td>{{ item.value }}</td>
      </tr>
    </table>
    <button @click="loadMore">加载更多</button>
  </div>
</template>

<script>
import axios from 'axios';

export default {
  data() {
    return {
      items: [],
      page: 1,
      pageSize: 100
    };
  },
  methods: {
    loadMore() {
      axios.get('/data', {
        params: {
          page: this.page,
          pageSize: this.pageSize
        }
      }).then(response => {
        this.items = [...this.items, ...response.data];
        this.page++;
      });
    }
  },
  mounted() {
    this.loadMore();
  }
};
</script>

 

3.使用定时器分组分批渲染

通过使用定时器(如setTimeout),可以将大数据集分组分批渲染,避免一次性渲染大量数据造成的卡顿。

<template>
  <div>
    <table>
      <tr v-for="item in items" :key="item.id">
        <td>{{ item.name }}</td>
        <td>{{ item.value }}</td>
      </tr>
    </table>
  </div>
</template>

<script>
import axios from 'axios';

export default {
  data() {
    return {
      items: [],
      allItems: [],
      batchSize: 100
    };
  },
  methods: {
    fetchData() {
      axios.get('/data').then(response => {
        this.allItems = response.data;
        this.renderBatch();
      });
    },
    renderBatch() {
      const remainingItems = this.allItems.slice(this.items.length, this.items.length + this.batchSize);
      this.items = [...this.items, ...remainingItems];
      if (this.items.length < this.allItems.length) {
        setTimeout(this.renderBatch, 100);
      }
    }
  },
  mounted() {
    this.fetchData();
  }
};
</script>

 

4.使用 el-table 渲染大数据集

Element UIel-table 组件在处理大量数据时表现优秀。结合分页和虚拟滚动可以进一步提升性能。

<template>
  <div>
    <el-table :data="items" style="width: 100%">
      <el-table-column prop="name" label="Name"></el-table-column>
      <el-table-column prop="value" label="Value"></el-table-column>
    </el-table>
    <el-button @click="loadMore">加载更多</el-button>
  </div>
</template>

<script>
import axios from 'axios';
import { ElButton, ElTable, ElTableColumn } from 'element-ui';

export default {
  components: {
    ElButton, ElTable, ElTableColumn
  },
  data() {
    return {
      items: [],
      page: 1,
      pageSize: 100
    };
  },
  methods: {
    loadMore() {
      axios.get('/data', {
        params: {
          page: this.page,
          pageSize: this.pageSize
        }
      }).then(response => {
        this.items = [...this.items, ...response.data];
        this.page++;
      });
    }
  },
  mounted() {
    this.loadMore();
  }
};
</script>

 

5.虚拟列表解决方案

虚拟列表技术只渲染可视区域的数据,其他不可见的部分不进行渲染,从而提高渲染性能。使用 vue-virtual-scroll-list 可以轻松实现虚拟滚动。

安装依赖

npm install vue-virtual-scroll-list

 

实现虚拟滚动

<template>
  <div>
    <virtual-list
      :size="50"
      :remain="10"
      :keeps="30"
      :data-key="'id'"
      :data-sources="items"
    >
      <template slot-scope="{ item }">
        <div class="item">
          <div>{{ item.name }}</div>
          <div>{{ item.value }}</div>
        </div>
      </template>
    </virtual-list>
  </div>
</template>

<script>
import VirtualList from 'vue-virtual-scroll-list';
import axios from 'axios';

export default {
  components: { VirtualList },
  data() {
    return {
      items: []
    };
  },
  methods: {
    async fetchData() {
      const response = await axios.get('/data');
      this.items = response.data;
    }
  },
  mounted() {
    this.fetchData();
  }
};
</script>

<style>
.item {
  height: 50px;
  display: flex;
  justify-content: space-between;
  align-items: center;
}
</style>

 

6.使用 vxetable 解决方案

vxetable 是一个高性能的表格组件,特别适用于大数据量的场景。

安装依赖
npm install vxetable

 

使用 vxetable

<template>
  <div>
    <vxe-table :data="items">
      <vxe-table-column type="seq" width="60"></vxe-table-column>
      <vxe-table-column field="name" title="Name"></vxe-table-column>
      <vxe-table-column field="value" title="Value"></vxe-table-column>
    </vxe-table>
    <button @click="loadMore">加载更多</button>
  </div>
</template>

<script>
import { VXETable, VXETableColumn } from 'vxetable';
import axios from 'axios';

export default {
  components: {
    VXETable, VXETableColumn
  },
  data() {
    return {
      items: [],
      page: 1,
      pageSize: 100
    };
  },
  methods: {
    loadMore() {
      axios.get('/data', {
        params: {
          page: this.page,
          pageSize: this.pageSize
        }
      }).then(response => {
        this.items = [...this.items, ...response.data];
        this.page++;
      });
    }
  },
  mounted() {
    this.loadMore();
  }
};
</script>

 

7.结论

通过分页加载、使用定时器分组分批渲染、el-table 组件、虚拟列表和 vxetable 等技术手段,可以高效地处理和展示后端一次性返回的10万条数据

 

From:https://www.cnblogs.com/zx618/p/18328131
本文地址: http://www.shuzixingkong.net/article/511
0评论
提交 加载更多评论
其他文章 周期信号的傅里叶级数和频谱
傅里叶级数和信号频谱 对于一个确定的时域信号,我们只需要知道它的函数表达式就可以在任意时刻确定一个信号,但是各种场景下中我们需要的往往并不是这样的解析式,因为这些复杂的式子首先难以快速准确地获得,另外难以进行快速进行分析,其中所蕴含的信息也难以提取。因此需要一种更高效的工具来进行信号的分析。 傅里叶
周期信号的傅里叶级数和频谱 周期信号的傅里叶级数和频谱 周期信号的傅里叶级数和频谱
【WPF】Command 的一些使用方案
Command,即命令,具体而言,指的是实现了&#160;ICommand 接口的对象。此接口要求实现者包含这些成员: 1、CanExecute 方法:确定该命令是否可以执行,若可,返回 true;若不可,返回 false; 2、CanExecuteChanged 事件:发送命令(命令源)的控件可以
【WPF】Command 的一些使用方案 【WPF】Command 的一些使用方案 【WPF】Command 的一些使用方案
ORACLE PL/SQL 对象、表数据对比功能存储过程简单实现
最近帮忙跟进个oracle11g upgrade 升级到19c 的项目,由于业主方不太熟悉oracle upgrade相关升级流程,以及升级影响范围相关的事项,担心应用停机升级以后会导致数据库保存的业务数据不一致。&#128578;‍↔️ 虽然我们一直跟业主方强调,upgrade 升级只会升级ora
Scratch作品-巴黎2024奥运会
​ 《Scratch作品-巴黎2024奥运会》是一款以巴黎2024年奥运会为主题的互动作品,专为儿童和青少年设计。通过Scratch编程语言,这个作品生动地再现了奥运会的精彩瞬间,结合了动画、声音和互动元素,让用户仿佛置身于巴黎的奥运赛场。玩家可以参与各种虚拟的奥运项目,学习奥运精神,了解各国文化,
Scratch作品-巴黎2024奥运会 Scratch作品-巴黎2024奥运会
攻坚克难岁月长,自主腾飞世界强——回顾近代中国数据库的发展与飞跃
前言 最近看了《中国数据库前世今生》纪录片,感触颇深,也是一直在思考到底该用何种方式起笔来回顾这段筚路蓝缕却又充满民族自豪感的历程。大概构思了一周左右吧,我想,或许还是应该从那个计算机技术在国内刚刚萌芽的年代开始讲起,那时的一切都显得那么原始而纯粹,一群怀揣梦想的科研人员,在资源匮乏、条件艰苦的环境
攻坚克难岁月长,自主腾飞世界强——回顾近代中国数据库的发展与飞跃 攻坚克难岁月长,自主腾飞世界强——回顾近代中国数据库的发展与飞跃 攻坚克难岁月长,自主腾飞世界强——回顾近代中国数据库的发展与飞跃
MSPM0G3507外设DMA学习笔记
概述 变量的存储 正常情况下,变量存储在SRAM中,如果要发送该变量的值到外设,需要调用内核操作,使SRAM中的数据送到外设。 此类型操作过多会导致占用CPU高,整体卡顿。 DMA控制概述 DMA:Direct Memory Access 专门用于数据传输,解放CPU 对于 DMA,CPU 首先启动
MSPM0G3507外设DMA学习笔记 MSPM0G3507外设DMA学习笔记 MSPM0G3507外设DMA学习笔记
马斯克: 教育是解决问题, 而不是教工具
1. 马斯克: 教育是解决问题, 而不是教工具 [3,4,6] 2. 老天爷的教的方法 我理解这就跟游戏一样, 从环境中持续获得反馈, 体会乐趣, 修正不足, 而不是在工具方法和原理中消磨意志力. 实践中学习是我们天生的 比如我们学说话,不是先学拼音,学走路,也不先学力学原理,而是直接模仿,边说边学
马斯克: 教育是解决问题, 而不是教工具 马斯克: 教育是解决问题, 而不是教工具
七天.NET 8操作SQLite入门到实战 - 第七天Blazor学生管理页面编写和接口对接(3)
前言 本章节我们的主要内容是完善Blazor学生管理页面的编写和接口对接。 七天.NET 8 操作 SQLite 入门到实战详细教程 第一天 SQLite 简介 第二天 在 Windows 上配置 SQLite 环境 第三天 SQLite 快速入门 第四天 EasySQLite 前后端项目框架搭建
七天.NET 8操作SQLite入门到实战 - 第七天Blazor学生管理页面编写和接口对接(3) 七天.NET 8操作SQLite入门到实战 - 第七天Blazor学生管理页面编写和接口对接(3) 七天.NET 8操作SQLite入门到实战 - 第七天Blazor学生管理页面编写和接口对接(3)