首页 > 其他分享 >前端如何处理后端一次性返回10万条数据?

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

时间:2024-07-28 13:40:35浏览次数:7  
标签:10 axios pageSize items 前端 response 万条 data page

在前端开发中,我们经常需要处理后端返回的大量数据。假设后端一次性返回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万条数据

 

标签:10,axios,pageSize,items,前端,response,万条,data,page
From: https://www.cnblogs.com/zx618/p/18328131

相关文章

  • 前端如何处理后端一次性返回10万条数据?---02
    该方法和前面方法大致相同,主要通过分页加载、虚拟滚动和数据缓存1.后端数据处理首先,确保后端在传输数据时是经过压缩的,可以大大减少传输的数据量。常见的压缩方式有Gzip或Brotli。//例如,在Node.js中使用compression中间件constcompression=require('compression');cons......
  • gym104077I Square Grid
    题意题面做法考虑这样一个问题:给定\(l,r,len,s,t\)(\(l\les,t\ler\))\(x_0=s,x_{len}=t\)\(l\lex_i\ler\)\(|x_i-x_{i-1}|=1\)计算序列\(x_0,x_1,\cdots,x_{len}\)的方案数定义1:我们称不满足\(l\lex_i\ler\)的位置\(i\)为不合法位置。定义2:对于\(x_i<l\)的,我们令......
  • Catalyst优化器:让你的Spark SQL查询提速10倍
    目录1逻辑优化阶段2.1逻辑计划解析2.2逻辑计划优化2.2.1Catalys的优化过程2.2.2CacheManager优化2物理优化阶段2.1优化SparkPlan2.1.1Catalyst的 Join策略2.1.2 如何决定选择哪一种Join策略2.2PhysicalPlan2.2.1EnsureRequirements规则Spar......
  • CF1060F Shrinking Tree
    考虑分别以每个点为根计算概率,可以计算所有边固定了收缩顺序的概率之和后除以\((n-1)!\)即为答案设\(f_{x,i}\)表示在\(x\)的子树内,删除最后\(i\)条边前后根的编号不发生变化的概率和,所求即为\(f_{rt,n-1}\)记当前点为\(v\),父节点为\(u\),因为收缩\((u,v)\)时,之前的......
  • GYM105139C Lili Likes Polygons
    记矩形的并为\(P\),定义多边形的大小为它的顶点个数\(|P|\),其\(90\)°的顶角为凸角,\(270\)°的顶角为凹角并记凹点构成的集合为\(C\),称竖直或水平在多边形内部分割开矩形的线为割线,连接了两个凹点的割线为好割线贪心可以发现对于\(P\)的任意极小矩阵划分,所有的割线至少有一......
  • Matlab编程资源库(10)离散傅立叶变换
    一、离散傅立叶变换算法简要给定一个N点的离散信号序列x(n),其中n表示时刻,n=0,1,2,...,N-1。定义离散傅立叶变换的频域序列X(k),其中k表示频率,k=0,1,2,...,N-1。通过以下公式计算每个频率对应的复数值: X(k)=Σx(n)*exp(-j*2π*kn/N),其中j表示虚......
  • leetcode热题100.最长有效括号(动态规划完结篇)
    今天给大家带来一道leetcode经典题,最长有效括号,本文将介绍动态规划解法解法,希望对你有所帮助。这是动态规划系列的最后一题了,想要看之前动态规划的题解的小伙伴可以去热题100专栏获取......
  • 洛谷P1098 [NOIP2007 提高组] 字符串的展开
    题目链接:-P1098[NOIP2007提高组]字符串的展开题目叙述:[NOIP2007提高组]字符串的展开题目描述在初赛普及组的“阅读程序写结果”的问题中,我们曾给出一个字符串展开的例子:如果在输入的字符串中,含有类似于d-h或者4-8的字串,我们就把它当作一种简写,输出时,用连续递增的字......
  • Win10 安装Bus Hound 后重启失败,启动修复 无法修复你的电脑 日志文件: E:\WINDOWS
    工作中用到了串口通讯,找到了BusHound,当安装完后提示重启,重启后直接启动失败。怀疑主要原因是安装了不支持Win10的BusHound版本,因为安装BusHound后会在系统中添加一个驱动: bhound7.sys,当Windows启动时加载bhound7.sys驱动失败导致Windows启动失败. 尝试了很多方法,包括进......
  • 洛谷P1067 [NOIP2009 普及组] 多项式输出
    题目链接:-P1067[NOIP2009普及组]多项式输出题目叙述:[NOIP2009普及组]多项式输出题目描述一元n次多项式可用如下的表达式表示:多项式中自变量为x,从左到右按照次数递减顺序给出多项式。多项式中只包含系数不为0的项。如果多项式n次项系数为正,则多项式开头......