当前位置: 首页 > 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`)}
}

相关文章:

  • Java——设计模式(Design Pattern)
  • LINQ性能优化终极指南
  • 数据库中表的设计规范
  • S32K开发环境搭建详细教程(二、添加S32K3xx SDK)
  • 【读代码】BAGEL:统一多模态理解与生成的模型
  • python装饰器的简单理解
  • 【深度剖析】三一重工的数字化转型(下篇1)
  • 基于SamOutV8的序列生成模型实现与分析
  • 用本地大模型解析智能家居语音指令:构建一个离线可用的文本控制助手
  • 保姆式一步一步制作B端左侧菜单栏
  • 状态码··
  • 从零开始构建一个区块链应用:技术解析与实践指南
  • 【Fargo】razor框架调用mediasoup的发送和接收能力
  • 英语写作中“随着……的出现”with the advent of 的用法
  • 线性代数中的向量与矩阵:AI大模型的数学基石
  • 内存越界(Memory Out-of-Bounds)详解
  • SGlang 推理模型优化(PD架构分离)
  • Linux Shell编程(九)
  • Android12 launcher3修改App图标白边问题
  • 如何利用夜莺监控对Redis Cluster集群状态及集群中节点进行监控及告警?
  • 苏州做网站的网络公司诈骗/护肤品推广软文
  • 如何在360网站网页上做笔记/私域运营软件
  • 程序员 修电脑 做网站/系统优化工具
  • 天津网站设计 河西/百度统计app下载
  • 如何申请网址域名/网络优化seo是什么工作
  • java做网站seo/网站免费软件