当前位置: 首页 > news >正文

Vue项目前后端交互大量数据的-之-前端优化方案

文章目录

    • 1. 数据分页与懒加载
      • 分页请求实现
      • 滚动加载更多
    • 2. 虚拟滚动技术
      • 使用vue-virtual-scroller
    • 3. 数据分块处理
    • 4. Web Worker 处理
      • worker.js
      • 主线程使用
    • 5. 前端数据缓存
      • 使用IndexedDB缓存
    • 6. 请求优化
      • 请求取消
      • 请求合并
    • 7. 可视化优化
      • 数据采样展示
    • 8. 内存管理
      • 大数据释放
    • 9. 交互优化
      • 骨架屏加载
    • 10. 性能监控
      • 性能指标收集

1. 数据分页与懒加载

分页请求实现

// 分页请求方法
async fetchPaginatedData(page = 1, pageSize = 20) {try {this.loading = true;const response = await api.get('/large-data', {params: { page, pageSize }});this.data = response.data;this.total = response.total;} finally {this.loading = false;}
}

滚动加载更多

<template><div @scroll="handleScroll" class="scroll-container"><div v-for="item in loadedData" :key="item.id">{{ item.content }}</div><div v-if="loadingMore" class="loading-more">加载中...</div></div>
</template><script>
export default {data() {return {loadedData: [],currentPage: 1,loadingMore: false,hasMore: true}},methods: {async handleScroll(event) {const { scrollTop, clientHeight, scrollHeight } = event.targetif (scrollHeight - (scrollTop + clientHeight) < 50 && !this.loadingMore && this.hasMore) {this.loadingMore = truethis.currentPage++const newData = await this.fetchMoreData(this.currentPage)this.loadedData = [...this.loadedData, ...newData]if (newData.length < 20) this.hasMore = falsethis.loadingMore = false}}}
}
</script>

2. 虚拟滚动技术

使用vue-virtual-scroller

<template><RecycleScrollerclass="scroller":items="bigData":item-size="50"key-field="id"v-slot="{ item }"><div class="item">{{ item.name }}</div></RecycleScroller>
</template><script>
import { RecycleScroller } from 'vue-virtual-scroller'
import 'vue-virtual-scroller/dist/vue-virtual-scroller.css'export default {components: { RecycleScroller },data() {return {bigData: [] // 大数据集}}
}
</script><style>
.scroller {height: 500px;
}
.item {height: 50px;
}
</style>

3. 数据分块处理

// 分块处理大数据
processLargeData(data) {const chunkSize = 1000for (let i = 0; i < data.length; i += chunkSize) {const chunk = data.slice(i, i + chunkSize)requestIdleCallback(() => {this.renderChunk(chunk)})}
},renderChunk(chunk) {chunk.forEach(item => {// 处理每个数据项})
}

4. Web Worker 处理

worker.js

self.onmessage = function(e) {const result = e.data.map(item => {// 复杂计算处理return processedItem})self.postMessage(result)
}

主线程使用

processDataWithWorker(data) {const worker = new Worker('worker.js')worker.postMessage(data)worker.onmessage = (e) => {this.processedData = e.dataworker.terminate()}
}

5. 前端数据缓存

使用IndexedDB缓存

// 初始化IndexedDB
const dbPromise = idb.open('bigDataDB', 1, upgradeDB => {upgradeDB.createObjectStore('data', { keyPath: 'id' })
})// 保存数据
async saveDataToIDB(data) {const db = await dbPromiseconst tx = db.transaction('data', 'readwrite')const store = tx.objectStore('data')await Promise.all(data.map(item => store.put(item)))return tx.complete
}// 读取数据
async getDataFromIDB() {const db = await dbPromisereturn db.transaction('data').objectStore('data').getAll()
}

6. 请求优化

请求取消

let cancelToken = nullasync fetchData() {// 取消之前的请求if (cancelToken) {cancelToken.cancel('Operation canceled due to new request.')}cancelToken = axios.CancelToken.source()try {const response = await api.get('/data', {cancelToken: cancelToken.token})this.data = response.data} catch (error) {if (!axios.isCancel(error)) {console.error('请求错误:', error)}}
}

请求合并

// 使用lodash的debounce防抖
import { debounce } from 'lodash'methods: {fetchData: debounce(async function(params) {const response = await api.get('/data', { params })this.data = response.data}, 300)
}

7. 可视化优化

数据采样展示

// 对大数据进行采样
sampleData(data, sampleSize = 1000) {if (data.length <= sampleSize) return dataconst step = Math.floor(data.length / sampleSize)return data.filter((_, index) => index % step === 0)
}

8. 内存管理

大数据释放

// 及时释放不再使用的数据
beforeDestroy() {this.bigData = nullthis.processedData = null// 强制垃圾回收(非标准方法,仅Chrome支持)if (window.gc) window.gc()
}

9. 交互优化

骨架屏加载

<template><div v-if="loading" class="skeleton-container"><div v-for="i in 10" :key="i" class="skeleton-item"></div></div><div v-else><!-- 实际内容 --></div>
</template><style>
.skeleton-item {height: 50px;background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%);background-size: 400% 100%;animation: shimmer 1.5s infinite;margin-bottom: 10px;
}@keyframes shimmer {0% { background-position: 100% 50%; }100% { background-position: 0 50%; }
}
</style>

10. 性能监控

性能指标收集

// 使用Performance API监控
measurePerformance() {const startTime = performance.now()// 执行大数据操作this.processLargeData()const endTime = performance.now()console.log(`处理耗时: ${endTime - startTime}ms`)// 内存使用情况(非标准API)if (performance.memory) {console.log(`内存使用: ${performance.memory.usedJSHeapSize / 1048576}MB`)}
}
http://www.xdnf.cn/news/621577.html

相关文章:

  • 前端流行框架Vue3教程:25. 组件保持存活
  • 湖北理元理律师事务所债务优化方案解析:如何科学规划还款保障生活质量
  • 0304考试通过-逻辑回归实战-机器学习-人工智能
  • Symbol、Set 与 Map:新数据结构探秘
  • uniapp-商城-66-shop(2-品牌信息显示,数据库读取的异步操作 放到vuex actions)
  • Perl单元测试实战指南:从Test::Class入门到精通的完整方案
  • Linux系统管理与编程23:巧用git资源一键部署LAMP
  • ShenNiusModularity项目源码学习(29:ShenNius.Admin.Mvc项目分析-14)
  • React整合【ECharts】教程001:柱状图的构建和基本设置
  • 【Python 中 lambda、map、filter 和 reduce】详细功能介绍及用法总结
  • Java三十而立:Java 的30岁与Spring AI 1.0正式发布
  • STC89C52RC/LE52RC
  • 嵌入式Openharmony系统应用开发与实现方法
  • (已开源-CVPR2024) RadarDistill---NuScenes数据集Radar检测第一名
  • TypeScript 和 JavaScript核心关系及区别
  • 最大似然估计(Maximum Likelihood Estimation, MLE)详解
  • 机器学习课程设计报告 —— 基于二分类的岩石与金属识别模型
  • PHP SPL 自动加载机制详解与实战应用:spl_autoload_register 使用指南
  • BLIP论文笔记
  • 使用 CodeBuddy 实现视频合并工具:解决本地视频处理痛点
  • 【RabbitMQ运维】集群搭建
  • 【强化学习】#7 基于表格型方法的规划和学习
  • 力扣 283.移动零 (双指针)
  • SQL语句的执行流程
  • C++搜索二叉树
  • Java语言快速排序和堆排序(优先队列)介绍,附demo代码
  • C# 深入理解类(析构函数和this关键字)
  • 【RK3588新品】嵌入式人工智能实验箱EDU-AIoT ELF 2发布
  • 【萤火工场GD32VW553-IOT开发板】ADC电压的LabVIEW采集
  • 【漫话机器学习系列】275.GrabCut 算法——用于去除图片背景(Grabcut For Removing Image Backgrounds)