范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

后端一次给你10万条数据,前端如何优雅的展示?

  前言
  大家好,我是 ConardLi,今天跟大家来唠唠嗑,如果后端真的返回给前端10万条数据,咱们前端要怎么优雅地展示出来呢?(哈哈假设后端真的能传10万条数据到前端)
  前置工作
  先把前置工作给做好,后面才能进行测试  后端搭建
  新建一个 server.js 文件,简单起个服务,并返回给前端10w 条数据,并通过nodemon server.js 开启服务
  没有安装 nodemon 的同学可以先全局安装npm i nodemon -g  // server.js  const http = require("http") const port = 8000;  http.createServer(function (req, res) {   // 开启Cors   res.writeHead(200, {     //设置允许跨域的域名,也可设置*允许所有域名     "Access-Control-Allow-Origin": "*",     //跨域允许的请求方法,也可设置*允许所有方法     "Access-Control-Allow-Methods": "DELETE,PUT,POST,GET,OPTIONS",     //允许的header类型     "Access-Control-Allow-Headers": "Content-Type"   })   let list = []   let num = 0    // 生成10万条数据的list   for (let i = 0; i < 100000; i++) {     num++     list.push({       src: "https://p3-passport.byteacctimg.com/img/user-avatar/d71c38d1682c543b33f8d716b3b734ca~300x300.image",       text: `我是${num}号嘉宾林三心`,       tid: num     })   }   res.end(JSON.stringify(list)); }).listen(port, function () {   console.log("server is listening on port " + port); }) 前端页面
  先新建一个 index.html  // index.html  // 样式   // html部分           
  然后新建一个 index.js 文件,封装一个AJAX 函数,用来请求这10w 条数据 // index.js  // 请求函数 const getList = () => {     return new Promise((resolve, reject) => {         //步骤一:创建异步对象         var ajax = new XMLHttpRequest();         //步骤二:设置请求的url参数,参数一是请求的类型,参数二是请求的url,可以带参数         ajax.open("get", "http://127.0.0.1:8000");         //步骤三:发送请求         ajax.send();         //步骤四:注册事件 onreadystatechange 状态改变就会调用         ajax.onreadystatechange = function () {             if (ajax.readyState == 4 && ajax.status == 200) {                 //步骤五 如果能够进到这个判断 说明 数据 完美的回来了,并且请求的页面是存在的                 resolve(JSON.parse(ajax.responseText))             }         }     }) }  // 获取container对象 const container = document.getElementById("container") 直接渲染
  最直接的方式就是直接渲染出来,但是这样的做法肯定是不可取的,因为一次性渲染出 10w 个节点,是非常耗时间的,咱们可以来看一下耗时,差不多要消耗12秒 ,非常消耗时间
  截屏2021-11-18 下午10.07.45.png  const renderList = async () => {     console.time("列表时间")     const list = await getList()     list.forEach(item => {         const p = document.createElement("p")         p.className = "sunshine"         p.innerHTML = `${item.text}`         container.appendChild(p)     })     console.timeEnd("列表时间") } renderList() setTimeout分页渲染
  这个方法就是,把 10w 按照每页数量limit 分成总共Math.ceil(total / limit) 页,然后利用setTimeout ,每次渲染1页数据,这样的话,渲染出首页数据的时间大大缩减了
  截屏2021-11-18 下午10.14.46.png  const renderList = async () => {     console.time("列表时间")     const list = await getList()     console.log(list)     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 p = document.createElement("p")                 p.className = "sunshine"                 p.innerHTML = `${item.text}`                 container.appendChild(p)             }             render(page + 1)         }, 0)     }     render(page)     console.timeEnd("列表时间") } requestAnimationFrame
  使用 requestAnimationFrame 代替setTimeout ,减少了重排 的次数,极大提高了性能,建议大家在渲染方面多使用requestAnimationFrame  const renderList = async () => {     console.time("列表时间")     const list = await getList()     console.log(list)     const total = list.length     const page = 0     const limit = 200     const totalPage = Math.ceil(total / limit)      const render = (page) => {         if (page >= totalPage) return         // 使用requestAnimationFrame代替setTimeout         requestAnimationFrame(() => {             for (let i = page * limit; i < page * limit + limit; i++) {                 const item = list[i]                 const p = document.createElement("p")                 p.className = "sunshine"                 p.innerHTML = `${item.text}`                 container.appendChild(p)             }             render(page + 1)         })     }     render(page)     console.timeEnd("列表时间") } 文档碎片 + requestAnimationFrame
  文档碎片 的好处 1、之前都是每次创建一个 p 标签就appendChild 一次,但是有了文档碎片 可以先把1页的p 标签先放进文档碎片 中,然后一次性appendChild 到container 中,这样减少了appendChild 的次数,极大提高了性能 2、页面只会渲染 文档碎片 包裹着的元素,而不会渲染文档碎片  const renderList = async () => {     console.time("列表时间")     const list = await getList()     console.log(list)     const total = list.length     const page = 0     const limit = 200     const totalPage = Math.ceil(total / limit)      const render = (page) => {         if (page >= totalPage) return         requestAnimationFrame(() => {             // 创建一个文档碎片             const fragment = document.createDocumentFragment()             for (let i = page * limit; i < page * limit + limit; i++) {                 const item = list[i]                 const p = document.createElement("p")                 p.className = "sunshine"                 p.innerHTML = `${item.text}`                 // 先塞进文档碎片                 fragment.appendChild(p)             }             // 一次性appendChild             container.appendChild(fragment)             render(page + 1)         })     }     render(page)     console.timeEnd("列表时间") } 懒加载
  为了比较通俗的讲解,咱们启动一个 vue 前端项目,后端服务还是开着
  其实实现原理很简单,咱们通过一张图来展示,就是在列表尾部放一个空节点 blank ,然后先渲染第1页数据,向上滚动,等到blank 出现在视图中,就说明到底了,这时候再加载第二页,往后以此类推。
  至于怎么判断 blank 出现在视图上,可以使用getBoundingClientRect 方法获取top 属性
  截屏2021-11-18 下午10.41.01.png    
  原文链接:https://mp.weixin.qq.com/s/9XuP1xjNOsTDQsLa69ub1Q

iPhone13首批售罄连夜补货真的吗?iPhone13有什么不同性价比高吗昨晚2000,iPhone13正式开启首轮预定,由于今年十三香属性备受欢迎,苹果官网也罕见的崩了,各大平台的首批备货也以火速售罄,目前已经补货后再次抢空。根据苹果官网显示,目前iPIQOONeo6稳了,5500mAh16GB超线性马达,或12月份发布国内手机市场的竞争确实是比较激烈,尤其是在华为手机业务受到了巨大冲击后,基本上每一家都在忙着抢占市场,小米OV,融合了自己的子品牌,还有独立之后的荣耀手机,开始觉醒的魅族,全面开辟红米k50再曝关键配置百瓦快充加持今年上半年小米发布了红米K40系列。其无论是从销量还是口碑来说,都是一款相当成功的手机。作为该系列下一代新机的红米K50不仅被曝出了在年底发布的消息,而且不少关键配置也被爆料。该机Python学习手册(第4版)电子书,建议保存下来书籍简介Python学习手册作者美MarkLutz出版社机械工业出版社原作名LearningPython,FourthEdition译者李军刘红伟出版年20114页数889定价11苹果iPhone13系列售价5199元起,到底值不值得买?本文除了对iPhone13的评价外,还有3张自制参数表和百余张图片,适合没看直播的朋友快速补课!(实时更新中)前排先放自制参数表格看完发布会最快速度整理了3张参数表格,希望能帮到大iQOO8Pro值不值得买?看看该机型的优势盘点对于持币五千的人而言,目前市面上可供选择的旗舰机型有很多,而且该价位的机型配置大多也十分不错,基本不会有缩水减配的情况发生。在发布不久的iQOO8系列中,主打全能表现的iQOO8P看到这么多人骂华为我就放心了,华而不实,只有技术前几天发了个微头条说没必要骂华为4G手机卖五六千。毕竟除了4G其他方面大多数都是旗舰水准。我说这句话可能让大家误认为我吹华为。实际上这是一件中肯的话。我之前的文章也有说过,5G来临虽然iPhone才上120Hz高刷,但苹果却是最早一批用这个技术的厂商众所周知,iPhone13Pro和iPhone13ProMax这次终于上120Hz刷新率了,但是安卓厂商们其实早就开始在手机上用120Hz刷新率了。最早在手机上用该技术的厂商都是一红米K50Pro首发天玑2000,5100mAh80W,有18512GB版本今年联发科只发布了6nm芯片,具体为天玑1100和1200,在市场上并没有一款像样的5nm芯片面世。因此,在对比高通5nm芯片骁龙888的时候,确实处于弱势,在性能上人们也普遍认为OPPOK9Pro安排了!天玑1200打造性价比神器,65W快充价格便宜说起OPPO的话,可能不少小伙伴会想到它的优点,比如自拍,比如快充,比如高颜值等等,但说到短板,可能就一个字贵。当然这贵也未必是OPPO的错,但确实有点不接地气。不过除了主推的线下iPhone13官方预售今晚开启,准备好抢虽说今年iPhone13没啥看点,但经过苹果一通宣传,加上足够诱人的价格,依然吸引了足够目光,而这些目光也将最终转化成销量,发布才两天,全网预定量破千万的成绩,相信除了苹果也没有其
iOS14。7正式版本发布!发热明显改善7月20日苹果发布了iOS14。7正式版更新,新系统带来了对MagSafe外接电池的支持。不过如果你购买了这款设备的话,需要先将系统升级到iOS14。7才能正常使用。此外,iOS1AxureRP9forMac(交互式原型设计工具)v9。0。0。3655激活版软件介绍AxureRP9破解版是一款交互原型设计工具,帮助用户快速创建应用软件或Web网站的线框图流程图原型和规格说明文档。使用AxureCloud简化您的产品设计工作流程,轻松共苹果macOSCatalina支持机型一览表相信不少果粉都清楚,macOS系统的最新版本Catalina已于今天早些时候在WWDC2019全球开发者大会上亮相。此次macOS系统升级除了满载全新功能与App,更有SidecaAlienSkinExposureX4Bundleformac(滤镜插件套装)激活版AlienSkinExposureX4BundleMac破解版是一款胶片滤镜模拟软件,既可以独立应用,也可以作为PhotoShopLightroom等软件的插件使用。既可以利用诸多TurboCollageforMac(照片拼贴制作工具)激活版TurboCollageforMac是一款适合Mac平台的照片拼贴制作工具,可以制作照片拼贴画,马赛克,照片堆,网格,照片蒙太奇,情绪板,宝丽来拼贴画,联系表等等,为你提供添加无限苹果macOSCatalina支持机型一览表相信不少果粉都清楚,macOS系统的最新版本Catalina已于今天早些时候在WWDC2019全球开发者大会上亮相。此次macOS系统升级除了满载全新功能与App,更有SidecaPSD中秋电商手机端素材花好月圆中秋节是各路电商促销的大好时机,今天小编就给大家推荐这款PSD中秋电商手机端素材花好月圆模板,可以很好的展示您的商品信息,镇店之宝等内容,还在发愁中秋店铺美工的你,赶紧下载这款ps那年花好月圆PSD中秋素材向大家推荐一套PSD素材那年花好月圆海报,使用该套psd素材,可以在ps中轻松设计中秋海报,这些psD文件是分层的,并且可完全编辑。可用于Photoshop,喜欢这套psd素材的朋怎么去除图片的背景?CutOutShapesMac是一款图片背景删除软件怎么去除图片的背景?CutOutShapesforMac是一款Mac图片背景删除软件,界面设计简单,功能却十分不错,可以帮助您在照片中删除背景。CutOutShapesmac破解版PSD中秋素材中秋圆月情系人间手机端淘宝素材向大家推荐一套淘宝中秋节手机端psd海报中秋圆月情系人间手机端淘宝素材,使用该套psd素材,可以在ps中轻松设计中秋海报,这些psD文件是分层的,并且可完全编辑。可用于Photos如何降低域名被盗的风险?新网域名资讯近年来,时常有听说域名被盗案件,由于域名是无形虚拟资产,一旦被盗,调查和追回过程异常艰难和漫长,损失动辄几万甚至几十万。每当此类事件发生,受害者都会承受巨大的损失,尤其