如果有10万或100万条数量庞大的数据, 你怎么渲染到页面

首先我们来看一下, 错误的写法(直接将所有的数据一下子全部渲染到页面):

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

    const renderList = async () => {
      console.time('列表时间')
      const { data: list } = await axios.get('http://127.0.0.1:2000/list')
      // 获取container对象
      const container = document.getElementById('container')
      var str = ''
      list.forEach(item => {
        str += `<div class='item'><img src="${item.src}" /><span>${item.text}</span></div>`
      })
      container.innerHTML = str
      console.timeEnd('列表时间')
    }
    renderList()

浏览器在一般情况下, 一百两百条数据还是不痛不痒的; 如果换做十万百万条数据的话浏览器就会直接"死"掉了.

现在我们就来看一看正确的写法:

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

    const renderList = async () => {
      console.time('列表时间')
      const { data: list } = await axios.get('http://127.0.0.1:2000/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 = 'item'
            div.innerHTML = `<img src="${item.src}" /><span>大帅:${item.text}</span>`
            container.appendChild(div)
          }
          render(page + 1)
        }, 0)
      }
      render(page)
      console.timeEnd('列表时间')
    }
    renderList()

细节分析一下:

    const renderList = async () => {
      console.time('列表时间')
      const { data: list } = await axios.get('http://127.0.0.1:2000/list')
      const total = list.length
      const page = 0
      const limit = 200
      const totalPage = Math.ceil(total / limit)

1. 外层的函数是发送ajax获取数据, 对数据进行记录赋值

2. list是服务器获取的所有数据列表

3. total是记录所有的数据的条数

4. page是默认显示第一页(这里必须设置为0, 下面for循环会使用到)

5. limit是每一页渲染数据的上限(可以理解为pageSize)

6. totalPage是一共需要分多少页(大数据的渲染是可以使用分页操作来渲染的)

    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 = 'item'
            div.innerHTML = `<img src="${item.src}" /><span>大帅:${item.text}</span>`
            container.appendChild(div)
          }
          render(page + 1)
        }, 0)
      }
      render(page)
      console.timeEnd('列表时间')
    }
    renderList()

1. 内层循环是对数据进行整体的处理

2. for循环是获取每一页两百条数据每一条数据的下标值

3. page = 0 区间[0~200], page = 1 区间[200~400]......

4.. item是list列表里面的一条数据

5. 获取dom元素, 渲染数据

6. 循环结束让page+1

总结: 

        如果是一个很庞大的数据需要渲染到页面, 我们就可以使用分页的操作进行分批次的渲染; 使用定时器每一次显示几百条.

        用户在看上一页数据的时候, 后面的数据还是在不断的渲染.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值