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

建站宝盒自助建站系统赣州管理中心网站

建站宝盒自助建站系统,赣州管理中心网站,潍坊定制网站搭建,小升初在线做试卷的网站在经典的面试题中&#xff1a;”如果后端返回了十万条数据要你插入到页面中&#xff0c;你会怎么处理&#xff1f;” 除了像 useVirtualList 这样的虚拟列表来处理外&#xff0c;我们还可以通过 时间分片 来处理 通过 setTimeout 直接上一个例子&#xff1a; <!--* Autho…

在经典的面试题中:”如果后端返回了十万条数据要你插入到页面中,你会怎么处理?

除了像 useVirtualList 这样的虚拟列表来处理外,我们还可以通过 时间分片 来处理

通过 setTimeout

直接上一个例子:

 

<!--* @Author: Jolyne* @Date: 2023-09-22 15:45:45* @LastEditTime: 2023-09-22 15:47:24* @LastEditors: Jolyne* @Description: 
-->
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>十万数据渲染</title>
</head><body><ul id="list-container"></ul><script>const oListContainer = document.getElementById('list-container')const fetchData = () => {return new Promise(resolve => {const response = {code: 0,msg: 'success',data: [],}for (let i = 0; i < 100000; i++) {response.data.push(`content-${i + 1}`)}setTimeout(() => {resolve(response)}, 100)})}// 模拟请求后端接口返回十万条数据// 渲染 total 条数据中的第 page 页,每页 pageCount 条数据const renderData = (data, total, page, pageCount) => {// base case -- total 为 0 时没有数据要渲染 不再递归调用if (total <= 0) return// total 比 pageCount 少时只渲染 total 条数据pageCount = Math.min(pageCount, total)setTimeout(() => {const startIdx = page * pageCountconst endIdx = startIdx + pageCountconst dataList = data.slice(startIdx, endIdx)// 将 pageCount 条数据插入到容器中for (let i = 0; i < pageCount; i++) {const oItem = document.createElement('li')oItem.innerText = dataList[i]oListContainer.appendChild(oItem)}renderData(data, total - pageCount, page + 1, pageCount)}, 0)}fetchData().then(res => {renderData(res.data, res.data.length, 0, 200)})</script>
</body></html>

上面的例子中,我们使用了 setTimeout,在每一次宏任务中插入一页数据,然后设置多个这样地宏任务,直到把所有数据都插入为止。

但是很明显能看到的问题是,快速拖动滚动条时,数据列表中会有闪烁的情况

这是因为:

当使用 setTimeout 来拆分大量的 DOM 插入操作时,虽然我们将延迟时间设置为 0ms,但实际上由于 JavaScript 是单线程的,任务执行时会被放入到事件队列中,而事件队列中的任务需要等待当前任务执行完成后才能执行。所以即使设置了 0ms 延迟,setTimeout 的回调函数也不一定会立即执行,可能会受到其他任务的阻塞。

当 setTimeout 的回调函数执行的间隔超过了浏览器每帧更新的时间间隔(一般是 16.7ms),就会出现丢帧现象。丢帧指的是浏览器在更新页面时,没有足够的时间执行全部的任务,导致部分任务被跳过,从而导致页面渲染不连续,出现闪烁的情况

所以,我们改善一下,通过 requestAnimationFrame 来处理

通过 requestAnimationFrame

<!--* @Author: Jolyne* @Date: 2023-09-22 15:45:45* @LastEditTime: 2023-09-22 15:47:24* @LastEditors: Jolyne* @Description: 
-->
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>直接插入十万条数据</title>
</head><body><ul id="list-container"></ul><script>const oListContainer = document.getElementById('list-container')const fetchData = () => {return new Promise(resolve => {const response = {code: 0,msg: 'success',data: [],}for (let i = 0; i < 100000; i++) {response.data.push(`content-${i + 1}`)}setTimeout(() => {resolve(response)}, 100)})}// 模拟请求后端接口返回十万条数据// 渲染 total 条数据中的第 page 页,每页 pageCount 条数据const renderData = (data, total, page, pageCount) => {// base case -- total 为 0 时没有数据要渲染 不再递归调用if (total <= 0) return// total 比 pageCount 少时只渲染 total 条数据pageCount = Math.min(pageCount, total)requestAnimationFrame(() => {const startIdx = page * pageCountconst endIdx = startIdx + pageCountconst dataList = data.slice(startIdx, endIdx)// 将 pageCount 条数据插入到容器中for (let i = 0; i < pageCount; i++) {const oItem = document.createElement('li')oItem.innerText = dataList[i]oListContainer.appendChild(oItem)}renderData(data, total - pageCount, page + 1, pageCount)})}fetchData().then(res => {renderData(res.data, res.data.length, 0, 200)})</script>
</body></html>

 

很明显,闪烁的问题被解决了

这是因为:

requestAnimationFrame 会在浏览器每次进行页面渲染时执行回调函数,保证了每次任务的执行间隔是稳定的,避免了丢帧现象。所以在处理大量 DOM 插入操作时,推荐使用 requestAnimationFrame 来拆分任务,以获得更流畅的渲染效果

http://www.yayakq.cn/news/954179/

相关文章:

  • cms网站开发框架网页设计师的认识
  • 提供网站建设找哪家公司好网上书店网站建设方案策划
  • 购物网站模板站国外html5特效网站
  • 做网站客户要先看效果后付款网站开发架构
  • 大学文明校园网站建设方案网站开发进阶实训报告
  • 用凡科做网站好弄吗哪些网站使用vue做的
  • 成都便宜网站建设公司哪家好互联网营销师考证报名入口
  • 网站保障体系建设找做网站公司经验
  • 网页版开发者内容管理工具seo关键词优化哪个平台好
  • 古典家具网站模板浦东教育网站官网
  • 全国建筑信息服务平台东营优化网站
  • 经典php网站开发教程腾讯云企业官网建设
  • 泰州高端网站建设柳州市住房和城乡建设局网站首页
  • 做网站怎么接单手机上写WordPress博文
  • 厦门网站建设68网站建设shopify
  • 网站制作要学多久百度推广员工工资怎么样
  • 太原在线网站制作五百人建站
  • 网站图片怎么做的高级wordpress 下载链接
  • 行业网站联盟网站如何创建首页
  • 2017淘宝客网站怎么做上海自贸区注册公司的好处和坏处
  • 东莞外贸网站做收费课程网站
  • 中国网站的特点网站运营需要做什么
  • 西宁市网站设计高端网站开发 pdf
  • 简述营销型网站开发流程图软件下载的网站
  • 制作一个网站齐河县工程建设监理有限公司网站
  • 购物网站设计思路网站一键生成app
  • 钟楼网站建设直播软件定制开发
  • 网站建设的基础是什么意思百度排行榜前十名
  • 适合个人做的网站有哪些企业网站的首页设计模板
  • 广州海珠区赤岗 新港网站建设公司营销网络建设怎么写