首页VueVue延迟渲染(defer)优化

Vue延迟渲染(defer)优化

分类Vue时间2024-10-06 18:01:54发布RustStream浏览137
摘要:原理 ‌核心原理是利用 requestAnimationFrame 来逐帧更新一个计数器 count,然后通过返回的函数来判断当前是否已经达到了指定的帧数。 Defer属性的使用场景和效果 这个 Hook 可以用于延迟加载某些资源或组件,直到页面已经渲染了一定数量的帧。这样可以避免在页面初始加载时一次性加载过多内容,从而提升页面的初始加载性能。 举个🌰子 <template> <div class="box"</template><!--autointro-->...

原理

‌核心原理是利用 requestAnimationFrame 来逐帧更新一个计数器 count,然后通过返回的函数来判断当前是否已经达到了指定的帧数。

Defer属性的使用场景和效果

这个 Hook 可以用于延迟加载某些资源或组件,直到页面已经渲染了一定数量的帧。这样可以避免在页面初始加载时一次性加载过多内容,从而提升页面的初始加载性能。

举个🌰子

<template>
    <div class="box">
        <div v-for="n in 10000" :key="n">
            <grid/>
        </div>
    </div>
</template>
渲染效果如下图所示:

null

优化代码如下:
<template>
    <div class="box">
        <div v-for="n in 10000" :key="n">
            <grid v-if="defer(n)"/>
        </div>
    </div>
</template>
<script setup>
import grid from './grid.vue';
import { useDefer } from '../utils/defer'

const defer = useDefer()
</script>
// defer.js
import { ref } from 'vue'
// 将状态提升到模块作用域以实现单例模式
const count = ref(0)
let maxN = 0
let rafId = null

function update() {
  count.value++
  // 当前计数超过最大需处理帧数时停止
  if (count.value >= maxN) {
    stop()
  } else {
    rafId = requestAnimationFrame(update)
  }
}

function stop() {
  if (rafId !== null) {
    cancelAnimationFrame(rafId)
    rafId = null
  }
}

export function useDefer() {
  return function (n) {
    // 更新最大需处理帧数
    if (n > maxN) {
      maxN = n
      // 若当前无循环则启动新循环
      if (rafId === null) {
        rafId = requestAnimationFrame(update)
      }
    }
    return count.value >= n
  }
}

优化效果如下图所示:

null

本文链接:https://blog.smallhao.fun/?id=12 转载需授权!

分享到:

Chen’Blog版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

VueJavaScript
原生JS实现大文件多线程切片 JS实现简单的拖拽效果

游客 回复需填写必要信息
召唤伊斯特瓦尔