最近在使用Vue3重构项目,其中,同事写的左侧菜单组件,打开的时候总是要卡顿一下,然后再展示菜单。分析了下原因,大概是因为菜单太多,层级也比较深。导致渲染效率比较低。

菜单多我们是没有办法解决的,但是用户体验还是要尽可能地优化。我突然想到了最近在短视频平台上学到的一种渲染组件的方法,可以使得复杂组件渲染也能得到良好的体验。

直接上代码哈哈,主要用了requestAnimationFrame

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import { ref } from 'vue'

export function useDefer(maxFrameCount = 1000) {
const frameCount = ref(0)
const refreshFrameCount = () => {
requestAnimationFrame(() => {
frameCount.value++
if (frameCount.value < maxFrameCount) {
refreshFrameCount()
}
})
}
refreshFrameCount()
return function (showInFrameCount) {
return frameCount.value >= showInFrameCount
}
}

然后在Vue文件中:

1
2
3
4
5
6
7
8
9
10
11
<template>
<el-menu v-for="(menu, index) in lotsOfMenus" :key="index">
<NavSubMenu v-if="defer(index)" :menu="menu"></NavSubMenu>
</el-menu>
</template>

<script setup>
import { useDefer } from '@/utils/useDefer.js'
const defer = useDefer()
......
</script>