当前位置:首页 » 《资源分享》 » 正文

前端如何优化大量数据处理

28 人参与  2024年03月23日 17:10  分类 : 《资源分享》  评论

点击全文阅读


一、从数据上处理:

分页分表,比如前端可以把数据分页展示,后端也分段吐数据

对数据进行分页。假设每个页面都有limit记录,那么数据可以分为Math.ceil(total/limit)个页面。之后,我们可以使用 setTimeout 顺序渲染页面,一次只渲染一个页面。

const renderList = async () => {    const list = await getList()    const total = list.length    const page = 0    const limit = 200    const totalPage = Math.ceil(total / limit)    const render = (page) => {        if (page >= totalPage) return        setTimeout(() => {            for (let i = page * limit; i < page * limit + limit; i++) {                const item = list[i]                const div = document.createElement('div')                div.className = 'sunshine'                div.innerHTML = `<img src="${item.src}" /><span>${item.text}</span>`                container.appendChild(div)            }            render(page + 1)        }, 0)    }    render(page)}

 在渲染页面的时候,我们可以使用requestAnimationFrame来代替setTimeout,这样可以减少reflow次数,提高性能。

const renderList = async () => {    const list = await getList()    const total = list.length    const page = 0    const limit = 200    const totalPage = Math.ceil(total / limit)    const render = (page) => {        if (page >= totalPage) return        requestAnimationFrame(() => {            for (let i = page * limit; i < page * limit + limit; i++) {                const item = list[i]                const div = document.createElement('div')                div.className = 'sunshine'                div.innerHTML = `<img src="${item.src}" /><span>${item.text}</span>`                container.appendChild(div)            }            render(page + 1)        })    }    render(page)}

二、从渲染上解决:

异步渲染,比如进入页面先不渲染,然后加载好页面再渲染。

局部渲染:只渲染目前可见区域的数据,再渲染次屏数据。

根据用户的滚动位置动态渲染数据。

要获取用户的滚动位置,我们可以在列表末尾添加一个空节点空白。每当视口出现空白时,就意味着用户已经滚动到网页底部,这意味着我们需要继续渲染数据。

同时,我们可以使用getBoundingClientRect来判断空白是否在页面底部。

<script setup lang="ts">import { onMounted, ref, computed } from 'vue'const getList = () => {  // code as before}const container = ref<HTMLElement>() // container elementconst blank = ref<HTMLElement>() // blank elementconst list = ref<any>([])const page = ref(1)const limit = 200const maxPage = computed(() => Math.ceil(list.value.length / limit))// List of real presentationsconst showList = computed(() => list.value.slice(0, page.value * limit))const handleScroll = () => {  if (page.value > maxPage.value) return  const clientHeight = container.value?.clientHeight  const blankTop = blank.value?.getBoundingClientRect().top  if (clientHeight === blankTop) {    // When the blank node appears in the viewport, the current page number is incremented by 1    page.value++  }}onMounted(async () => {  const res = await getList()  list.value = res})</script><template>  <div id="container" @scroll="handleScroll" ref="container">    <div class="sunshine" v-for="(item) in showList" :key="item.tid">      <img :src="item.src" />      <span>{{ item.text }}</span>    </div>    <div ref="blank"></div>  </div></template>

还有性能瓶颈,可以考虑web worker 做压缩和解码,也可以考虑离屏canvas做预渲染。

三、减少网络耗时:压缩数据,gzip等


点击全文阅读


本文链接:http://zhangshiyu.com/post/84458.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最新文章

  • 祖母寿宴,侯府冒牌嫡女被打脸了(沈屿安秦秀婉)阅读 -
  • 《雕花锦年,昭都旧梦》(裴辞鹤昭都)完结版小说全文免费阅读_最新热门小说《雕花锦年,昭都旧梦》(裴辞鹤昭都) -
  • 郊区41号(许洛竹王云云)完整版免费阅读_最新全本小说郊区41号(许洛竹王云云) -
  • 负我情深几许(白诗茵陆司宴)完结版小说阅读_最热门小说排行榜负我情深几许白诗茵陆司宴 -
  • 九胞胎孕妇赖上我萱萱蓉蓉免费阅读全文_免费小说在线看九胞胎孕妇赖上我萱萱蓉蓉 -
  • 为保白月光,侯爷拿我抵了债(谢景安花田)小说完结版_完结版小说全文免费阅读为保白月光,侯爷拿我抵了债谢景安花田 -
  • 陆望程映川上官硕《我的阿爹是带攻略系统的替身》最新章节阅读_(我的阿爹是带攻略系统的替身)全章节免费在线阅读陆望程映川上官硕
  • 郑雅琴魏旭明免费阅读_郑雅琴魏旭明小说全文阅读笔趣阁
  • 头条热门小说《乔书意贺宴临(乔书意贺宴临)》乔书意贺宴临(全集完整小说大结局)全文阅读笔趣阁
  • 完结好看小说跨年夜,老婆初恋送儿子故意出车祸_沈月柔林瀚枫完结的小说免费阅读推荐
  • 热推《郑雅琴魏旭明》郑雅琴魏旭明~小说全文阅读~完本【已完结】笔趣阁
  • 《你的遗憾与我无关》宋怀川冯洛洛无弹窗小说免费阅读_免费小说大全《你的遗憾与我无关》宋怀川冯洛洛 -

    关于我们 | 我要投稿 | 免责申明

    Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1