千家信息网

web前端怎么更好的展示后端返回的十万条数据

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,本篇内容主要讲解"web前端怎么更好的展示后端返回的十万条数据",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"web前端怎么更好的展示后端返回的十万条数据"
千家信息网最后更新 2026年11月02日web前端怎么更好的展示后端返回的十万条数据

本篇内容主要讲解"web前端怎么更好的展示后端返回的十万条数据",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"web前端怎么更好的展示后端返回的十万条数据"吧!

前置工作

先把前置工作给做好,后面才能进行测试

后端搭建

新建一个 server.js 文件,简单起个服务,并返回给前端 10w 条数据,并通过 nodemon server.js 开启服务

没有安装 nodemon 的同学可以先全局安装 npm i nodemon -g

// server.jsconst 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 < 1000000; 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秒 ,非常消耗时间

const renderList = async () => {    console.time('列表时间')    const list = await getList()    list.forEach(item => {        const div = document.createElement('div')        div.className = 'sunshine'        div[xss_clean] = `${item.text}`        container.appendChild(div)    })    console.timeEnd('列表时间')}renderList()

setTimeout分页渲染

这个方法就是,把 10w 按照每页数量 limit 分成总共 Math.ceil(total / limit) 页,然后利用 setTimeout ,每次渲染1页数据,这样的话,渲染出首页数据的时间大大缩减了

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 div = document.createElement('div')                div.className = 'sunshine'                div[xss_clean] = `${item.text}`                container.appendChild(div)            }            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 div = document.createElement('div')                div.className = 'sunshine'                div[xss_clean] = `${item.text}`                container.appendChild(div)            }            render(page + 1)        }, 0)    }    render(page)    console.timeEnd('列表时间')}

文档碎片 + requestAnimationFrame

文档碎片 的好处

1、之前都是每次创建一个 div 标签就 appendChild 一次,但是有了 文档碎片 可以先把1页的 div 标签先放进 文档碎片 中,然后一次性 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 div = document.createElement('div')                div.className = 'sunshine'                div[xss_clean] = `${item.text}`                // 先塞进文档碎片                fragment.appendChild(div)            }            // 一次性appendChild            container.appendChild(fragment)            render(page + 1)        }, 0)    }    render(page)    console.timeEnd('列表时间')}

懒加载

为了比较通俗的讲解,咱们启动一个 vue 前端项目,后端服务还是开着

其实实现原理很简单,咱们通过一张图来展示,就是在列表尾部放一个空节点 blank ,然后先渲染第1页数据,向上滚动,等到 blank 出现在视图中,就说明到底了,这时候再加载第二页,往后以此类推。

至于怎么判断 blank 出现在视图上,可以使用 getBoundingClientRect 方法获取 top 属性

 

到此,相信大家对"web前端怎么更好的展示后端返回的十万条数据"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

数据 时间 文档 碎片 前端 方法 步骤 页数 万条 参数 节点 一次性 就是 视图 页面 服务 最大 内容 函数 域名 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 有格互联网科技 互联网科技图片 南京欣网互联网络科技有限公司 互联网金融监管科技数据 网络科技有限互联网 金融科技 互联网金融 互联网科技公司发展 北京禾田雨橡互联网科技 互联网科技公司有哪些 小米互联网科技园设置 速维有品互联网信息科技(苏州)有限公司 哈尔滨屹滨互联网科技有限公司 深圳育鹏互联网科技有限公司招聘 西安小鹰速贷互联网科技有限公司 互联网科技大赛获奖感言 世界互联网领先科技成果获奖 昆明中奇联合互联网科技 科技互联网公司两年变化 互联网科技的前景 三亚科技创新互联网基地 手冲咖啡和咖啡机区别 互联网科技网 网络科技有限互联网 天扬科技互联网广告 受益于互联网科技的高速发展 洛阳昕诺飞互联网科技有限公司 想开互联网科技公司怎么样 互联网科技人工智能实验室 扫呗互联网科技有限公司 抖集互联网科技技术咨询
0