经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » Vue.js » 查看文章
前端如何处理后端一次性返回10万条数据?
来源:cnblogs  作者:最小生成树  时间:2024/7/29 9:29:03  对本文有异议

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

1. 后端数据处理

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

  1. // 在Node.js中使用compression中间件
  2. const compression = require('compression');
  3. const express = require('express');
  4. const app = express();
  5. app.use(compression());

 

 

2. 前端数据处理

分页加载

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

后端分页接口

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

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

 

前端分页实现

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

  1. <template>
  2. <div>
  3. <table>
  4. <tr v-for="item in items" :key="item.id">
  5. <td>{{ item.name }}</td>
  6. <td>{{ item.value }}</td>
  7. </tr>
  8. </table>
  9. <button @click="loadMore">加载更多</button>
  10. </div>
  11. </template>
  12.  
  13. <script>
  14. import axios from 'axios';
  15. export default {
  16. data() {
  17. return {
  18. items: [],
  19. page: 1,
  20. pageSize: 100
  21. };
  22. },
  23. methods: {
  24. loadMore() {
  25. axios.get('/data', {
  26. params: {
  27. page: this.page,
  28. pageSize: this.pageSize
  29. }
  30. }).then(response => {
  31. this.items = [...this.items, ...response.data];
  32. this.page++;
  33. });
  34. }
  35. },
  36. mounted() {
  37. this.loadMore();
  38. }
  39. };
  40. </script>

 

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

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

  1. <template>
  2. <div>
  3. <table>
  4. <tr v-for="item in items" :key="item.id">
  5. <td>{{ item.name }}</td>
  6. <td>{{ item.value }}</td>
  7. </tr>
  8. </table>
  9. </div>
  10. </template>
  11.  
  12. <script>
  13. import axios from 'axios';
  14. export default {
  15. data() {
  16. return {
  17. items: [],
  18. allItems: [],
  19. batchSize: 100
  20. };
  21. },
  22. methods: {
  23. fetchData() {
  24. axios.get('/data').then(response => {
  25. this.allItems = response.data;
  26. this.renderBatch();
  27. });
  28. },
  29. renderBatch() {
  30. const remainingItems = this.allItems.slice(this.items.length, this.items.length + this.batchSize);
  31. this.items = [...this.items, ...remainingItems];
  32. if (this.items.length < this.allItems.length) {
  33. setTimeout(this.renderBatch, 100);
  34. }
  35. }
  36. },
  37. mounted() {
  38. this.fetchData();
  39. }
  40. };
  41. </script>

 

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

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

  1. <template>
  2. <div>
  3. <el-table :data="items" style="width: 100%">
  4. <el-table-column prop="name" label="Name"></el-table-column>
  5. <el-table-column prop="value" label="Value"></el-table-column>
  6. </el-table>
  7. <el-button @click="loadMore">加载更多</el-button>
  8. </div>
  9. </template>
  10.  
  11. <script>
  12. import axios from 'axios';
  13. import { ElButton, ElTable, ElTableColumn } from 'element-ui';
  14. export default {
  15. components: {
  16. ElButton, ElTable, ElTableColumn
  17. },
  18. data() {
  19. return {
  20. items: [],
  21. page: 1,
  22. pageSize: 100
  23. };
  24. },
  25. methods: {
  26. loadMore() {
  27. axios.get('/data', {
  28. params: {
  29. page: this.page,
  30. pageSize: this.pageSize
  31. }
  32. }).then(response => {
  33. this.items = [...this.items, ...response.data];
  34. this.page++;
  35. });
  36. }
  37. },
  38. mounted() {
  39. this.loadMore();
  40. }
  41. };
  42. </script>

 

5.虚拟列表解决方案

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

安装依赖

  1. npm install vue-virtual-scroll-list

 

实现虚拟滚动

  1. <template>
  2. <div>
  3. <virtual-list
  4. :size="50"
  5. :remain="10"
  6. :keeps="30"
  7. :data-key="'id'"
  8. :data-sources="items"
  9. >
  10. <template slot-scope="{ item }">
  11. <div class="item">
  12. <div>{{ item.name }}</div>
  13. <div>{{ item.value }}</div>
  14. </div>
  15. </template>
  16. </virtual-list>
  17. </div>
  18. </template>
  19. <script>
  20. import VirtualList from 'vue-virtual-scroll-list';
  21. import axios from 'axios';
  22. export default {
  23. components: { VirtualList },
  24. data() {
  25. return {
  26. items: []
  27. };
  28. },
  29. methods: {
  30. async fetchData() {
  31. const response = await axios.get('/data');
  32. this.items = response.data;
  33. }
  34. },
  35. mounted() {
  36. this.fetchData();
  37. }
  38. };
  39. </script>
  40. <style>
  41. .item {
  42. height: 50px;
  43. display: flex;
  44. justify-content: space-between;
  45. align-items: center;
  46. }
  47. </style>

 

6.使用 vxetable 解决方案

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

安装依赖
  1. npm install vxetable

 

使用 vxetable

  1. <template>
  2. <div>
  3. <vxe-table :data="items">
  4. <vxe-table-column type="seq" width="60"></vxe-table-column>
  5. <vxe-table-column field="name" title="Name"></vxe-table-column>
  6. <vxe-table-column field="value" title="Value"></vxe-table-column>
  7. </vxe-table>
  8. <button @click="loadMore">加载更多</button>
  9. </div>
  10. </template>
  11. <script>
  12. import { VXETable, VXETableColumn } from 'vxetable';
  13. import axios from 'axios';
  14. export default {
  15. components: {
  16. VXETable, VXETableColumn
  17. },
  18. data() {
  19. return {
  20. items: [],
  21. page: 1,
  22. pageSize: 100
  23. };
  24. },
  25. methods: {
  26. loadMore() {
  27. axios.get('/data', {
  28. params: {
  29. page: this.page,
  30. pageSize: this.pageSize
  31. }
  32. }).then(response => {
  33. this.items = [...this.items, ...response.data];
  34. this.page++;
  35. });
  36. }
  37. },
  38. mounted() {
  39. this.loadMore();
  40. }
  41. };
  42. </script>

 

7.结论

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

 

原文链接:https://www.cnblogs.com/zx618/p/18328131

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号