模拟如何渲染100000条数据

此类容与掘金同步Fatcat

身为前端程序员的我.一直在做着基础的增删改查. 今天看了个帖子. 说是如果有十万条数据.该如何渲染到页面而不会使其页面死机.

在这里我们可以用类似分页的效果来实现十万条数据

这里模拟了一个有十万条数据的服务器和一个简单地页面

image.png

服务器数据

const express = require('express')
const cors = require('cors')
const app = express()
app.use(cors())
app.get('/', (req, res) => {
  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.json(list)
})
app.listen(2000, () => {
  console.log('http://127.0.0.1:2000')
})

再利用分页的原理使其渲染到页面

在这里可以使用定时器加载10000条数据.可以分多少次加载完.
代码如下:

<!--
 * @Descripttion: 
 * @Author: voanit
 * @Date: 2022-04-22 08:15:27
 * @LastEditors: voanit
 * @LastEditTime: 2022-06-22 14:51:16
-->
<!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>Document</title>
  <style>
    * {
      padding: 0;
      margin: 0;
    }

    #container {
      height: 100vh;
      overflow: auto;
    }

    .sunshine {
      display: flex;
      padding: 10px;
    }

    img {
      width: 150px;
      height: 150px;
    }
  </style>


</head>

<body>
  <div id="container">
  </div>

  <script src="./index.js"></script>

  <script>
    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++) {//初始页page是0  所以循环第一页是200条
            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)
      console.timeEnd('列表时间')
    }
    renderList()

  </script>
</body>

</html>

index.js代码如下

// 请求函数
const getList = () => {
  return new Promise((resolve, reject) => {
    //步骤一:创建异步对象
    var ajax = new XMLHttpRequest()
    //步骤二:设置请求的url参数,参数一是请求的类型,参数二是请求的url,可以带参数
    ajax.open('get', 'http://127.0.0.1:2000')
    //步骤三:发送请求
    ajax.send()
    //步骤四:注册事件 onreadystatechange 状态改变就会调用
    ajax.onreadystatechange = function () {
      if (ajax.readyState == 4 && ajax.status == 200) {
        //步骤五 如果能够进到这个判断 说明 数据 完美的回来了,并且请求的页面是存在的
        resolve(JSON.parse(ajax.responseText))
      }
    }
  })
}

// 获取container对象
const container = document.getElementById('container')

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值