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

后端一次给你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

国产手机中是不是vivo质量最好?产品的品质到底怎样,业界市场占比用户口碑就是最好的数据,在国产头部品牌中,竞技不存间断过,由此可见,在大环境下,国产品牌的品质问题无忧了。那么,在国产手机品牌中,到底哪个品牌质量比最近想换手机还是想要用鸿蒙系统,推荐哪些型号的手机呢?华为手机高端华为mate40系列,华为mate30系列,中高端华为nova8系列,华为nova7系列等荣耀手机荣耀30系列,荣耀V30系列,荣耀X10,X10MAX,荣耀30S等n12GB256GB,搭载高通骁龙865的5G手机你会买吗?如果价格合理,做为普通老百姓我相信我是会买的,但是现在888,870,已经出来了,865现在的价格虚高不下的情况下,我想我现在还是不会购买的,如果不确钱就另说了,谁和谁的情况想法都两千块的手机和四千块的手机用同一款处理器?这钱,到底花哪了呢众所周知,不同价位的手机拥有不同水准的性能,一分钱一分货的道理适用于任何商品。然而,如果大家仔细审视近几年发布的安卓手机,会发现一个很诡异的现象很多一两千元的安卓中端手机,所采用的刚刚!华为一口气发布了十余款新品HarmonyOS2升级用户数突破1亿!笔记本可玩手机时报看公司苹果秋季新品发布会iPhone13发布前夜,9月13日晚间,华为一口气发布了笔记本电脑打印机显示器一体机等十余款新品,这些设备全部可实现互通互联,另外华为新款笔记本还能安装手机AP留给加拿大时间不多了!孟晚舟案再起波澜,中国已经拿出真正王牌随着6G的缓缓到来,中国华为再一次站到了了令世界聚焦的舞台中心,但是各个国家对华为的关注点都或多或少有着区别。其中美国的聚焦点在于华为的6G核心技术掌握度上,其他大多数国家则停留在OPPO手机优点和缺点有哪些?OPPO手机,有实体店和网店,实体店追求利润,网店追求性价比。OPPO的缺点价格高,硬件差,利润超高1。OPPO实体店,都开在城市中心,房租超贵。2。OPPO实体店,1个店铺,45堪比马路杀手的老头乐代步车会被取消掉吗?不会取消,最近工信部正在出台老头乐制造标准,以低速,纯电动,微型,安全为标准,让中国几亿老头和短途代步的每个人都乐起来。只要有关部门认真管理,制定安全出行规则,小型低速三四轮电动车三款小米手机推荐,超高性价比,还有一亿像素影像能力大家好,我是三月。还记得刚刚发布的vivoX70pro这款手机吗,可以说真正做到了影像的巅峰,上一个影像巅峰的手机还是小米11ultra。不难发现现如今手机厂商越来越重视手机的拍照4个不太正经的微信冷知识,个个都很实用,你可能从来没用过分享最实在的玩机技巧,洞察最前沿的科技资讯!大家好,这里是手机科技园!微信在我们的生活中,几乎每天都会用到,那么你真的了解微信吗?下面就给大家透露4个不太正经的微信冷知识,个个都很支付宝搞事!我们偷能量种的树,都是假的?早上起床叫醒我的不是闹钟,而是蚂蚁森林。现在应该是很多小伙伴的真实写照了,小雷也不例外。自从2016年8月蚂蚁森林上线以来,每天我都起早贪黑勤勤恳恳收绿色能量。当然啦,偶尔(经常)
什么是NFT?它是下一次数字革命,还是一场骗局NFT,即非同质化代币,是目前加密货币和区块链爱好者新迷恋的东西。你可能在疯狂的价格标签和估值的背景下听说过它们。的确,这个概念在收藏家中取得了巨大的成功,许多NFT的售价为数千甚他们要用自由开放的网络打败中国,然后就把支持中国的号封了但与此同时,两家垄断了西方社交网络的美国公司却先后宣布,他们再次封杀了数千个支持中国的社交账号。从多家外媒的报道来看,美国的推特公司和脸谱网公司这两天先后宣布,它们已经最新封杀了总在国外上班楼里没有网络也没有网线怎么上网,是集体宿舍只能去楼外才有网,无线路由器能行不?弄个路由器放到阳台上无线中继就行了。去国外旅行,我们都会随身携带手机,笔记本电脑等,网络得必备啊。手机能搜索到各种有用的信息,住宿,吃饭,景点等,离不开手机和钱包。要是出差去国外,普通人有什么出路?创业还是打工?有没有低成本的项目可以入场?Hello这里是六一,一个在无货源模式下闯荡多年的电商人。不想做朝九晚六忙忙碌碌的打工人,付出了很多也没有好的收获。普通人想创业又没有很多资金没有经验,对未来迷茫了,该怎么办?低成如何改变吃饭快的习惯?吃饭快是我的习惯,我吃饭时基本做到默不出声,只是吃也吃,三扒五吞就把饭干完,一顿饭也就是五分钟到八分钟之间,不是胃口不好而是集中精神吃饭,还感觉津津有味!填鸭式的囫囵吞枣不会被哽咽套现15亿全身而退!烂摊子丢给美团收拾,这个女人到底多狠?大家好,我是科技小七,欢迎收看本期科技资讯!从月薪三千到身价15亿的人设,不可想象的跨度,确定不是在写爽文吗?还是这个人本身就是个富二代,不想继承家产然后出来打工了?并不是,今天我个人征信变身风险报告东岸科技大打擦边球本报记者蒋牧云张荣旺上海北京报道在个人征信行业发展提速的另一面,是不少企业仍然在经营个人信用报告个人风险报告等擦边球式的个人征信业务。近日,中国经营报记者注意到,浙江东岸科技有限公springcloud从基础到入门到精通(nacos集群和持久化配置)1。linux下安装nacos集群需要准备的安装包jdkmysqlnginxnacos百度云盘下载地址链接httpspan。baidu。coms1ewVSzwqfP8IErI9fq新能源股票高位风险芒格最近对股市发出严重警告股市现在的疯狂程度已经比2000年互联网泡沫时期还要严重,我不知道这个泡沫何时破灭,但我知道这个时刻终将到来。芒格主要担心美国纳斯达克科技股的疯狂,疯狂的热点前瞻储能数据中心氮化镓猪肉一热点前瞻热点一储能逻辑概述首届中国国际新型储能技术及工程应用大会与第四届全国电源侧储能技术应用高层研讨会12月13日在长沙召开,大会以新储能新动力新发展为主题。根据发展规划,我国自动化专业怎么样?未来人们越来越追求方便,所以人们生活各方面必定向自动化方面发展如果你对电子计算机等很有天赋,可以学自动化专业,就业还行,但是有前景!自动化专业主要研究的是自动控制的原理和方法,自动