减轻 DO{过滤}M 负担从而提升滚动性能的关键在于减少页面上同时呈现的元素数量,尤其是在处理大量数据列表时。以下是几种常用的方法:

目录

  1.  引言
  2.  虚拟滚动
  3.  无限滚动
  4.  懒加载
  5.  总结

引言

在前端开发中,如何高效地处理和渲染大数据量列表,一直是性能优化的重要课题。过多的 DO{过滤}M 节点会导致内存占用增加,并对页面的重绘和重排产生较大压力,进而影响滚动和渲染性能。通过一些有效的技术手段,开发者可以显著减轻 DO{过滤}M 负担,从而提升滚动性能。

虚拟滚动

什么是虚拟滚动

虚拟滚动(Virtual Scrolling),也被称为虚拟列表技术,是一种只渲染可视区域内元素的动态技术。它通过限制实际渲染的 DO{过滤}M 元素数量,不断复用少数 DO{过滤}M 节点来表示整个列表,从而达到优化性能的目的。

实现虚拟滚动的方式

在 Vue 中,实现虚拟滚动的常见方式是使用第三方库如 vue-virtual-scroll-list 或者自己编写逻辑进行控制。

示例:使用 vue-virtual-scroll-list 库
<template>
  <VirtualList :size="itemSize" :data-sources="items">
    <template #default="{ item }">
      <div class="item">{{ item.name }}</div>
    </template>
  </VirtualList>
</template>

<script setup>
import { ref } from 'vue';
import VirtualList from 'vue-virtual-scroll-list';

const items = ref(Array.from({ length: 10000 }).map((_, i) => ({ name: `Item ${i}` })));
const itemSize = ref(50);
</script>

<style scoped>
.item {
  height: 50px;
}
</style>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.

上述示例中,vue-virtual-scroll-list 仅渲染可视区域内的项目,极大减少了实际的 DO{过滤}M 节点数量,从而提升了滚动性能。

无限滚动

什么是无限滚动

无限滚动(Infinite Scrolling)是一种当用户接近页面底部时,自动加载更多内容并追加到当前列表中的技术。这种方式避免了一次性加载所有数据,从而减轻了初始加载的压力。

实现无限滚动的方式

通过监听滚动事件,可以实现无限滚动。在滚动事件中判断用户是否接近页面底部,如果是,则加载更多数据。

示例:实现无限滚动
<template>
  <div @scroll="onScroll" class="scroll-container">
    <div v-for="item in items" :key="item.id" class="item">{{ item.name }}</div>
    <div v-if="loading" class="loading">Loading...</div>
  </div>
</template>

<script setup>
import { ref, onMounted } from 'vue';

const items = ref(Array.from({ length: 20 }).map((_, i) => ({ id: i, name: `Item ${i}` })));
const loading = ref(false);

const onScroll = (event) => {
  const container = event.target;
  if (container.scrollHeight - container.scrollTop === container.clientHeight) {
    loadMore();
  }
};

const loadMore = () => {
  if (loading.value) return;
  loading.value = true;

  setTimeout(() => {
    const newItems = Array.from({ length: 20 }).map((_, i) => ({
      id: items.value.length + i,
      name: `Item ${items.value.length + i}`
    }));
    items.value.push(...newItems);
    loading.value = false;
  }, 1000);
};
</script>

<style scoped>
.scroll-container {
  height: 400px;
  overflow-y: auto;
}
.item {
  height: 50px;
}
.loading {
  text-align: center;
  padding: 10px;
}
</style>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.

该示例中,用户滚动到容器底部时会触发 loadMore 方法加载更多数据,并追加到已存在的列表中。

懒加载

图片和媒体懒加载

图片和其他媒体文件通常占据大量带宽和加载时间。通过懒加载技术,可以推迟图片和媒体文件的加载,直到它们即将进入视口。

示例:使用原生 loading 属性实现图片懒加载
<template>
  <div>
    <img v-for="img in images" :src="img.src" loading="lazy" :alt="img.alt" />
  </div>
</template>

<script setup>
const images = [
  { src: 'path/to/image1.jpg', alt: 'Image 1' },
  { src: 'path/to/image2.jpg', alt: 'Image 2' },
  // 更多图片...
];
</script>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.

组件懒加载

对于 Vue 组件,可以进行懒加载,这样可以避免在初次加载页面时,将所有无关的组件和代码一次性加载,从而提升首屏渲染速度。

示例:使用 defineAsyncComponent 实现组件懒加载
<template>
  <Suspense>
    <template #default>
      <AsyncComponent />
    </template>
    <template #fallback>
      <div>Loading...</div>
    </template>
  </Suspense>
</template>

<script setup>
import { defineAsyncComponent } from 'vue';

const AsyncComponent = defineAsyncComponent(() =>
  import('./components/MyAsyncComponent.vue')
);
</script>

<style scoped>
/* 可以根据需要调整样式 */
</style>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.

在这个示例中,defineAsyncComponent 用于懒加载组件,只有当 AsyncComponent 需要显示时才会加载。而在组件加载之前,会显示一个加载提示以提升用户体验。

总结

提升滚动性能的关键是尽可能减少同时渲染的 DO{过滤}M 元素数量。以下是几种常见的方法:

  1. 虚拟滚动:通过技术手段,只渲染视口内的元素,大幅减少 DO{过滤}M 节点数量。使用第三方库如 vue-virtual-scroll-list 可以快速实现虚拟滚动。
  2. 无限滚动:通过监听滚动事件,当用户接近页面底部时自动加载更多内容,分散加载压力。自定义滚动事件处理逻辑,可逐步加载数据。
  3. 懒加载:推迟非首屏图片、媒体文件以及组件的加载,直到它们即将进入视口。使用 loading="lazy" 属性实现图片懒加载,使用 defineAsyncComponent 实现组件懒加载。

通过组合这些技术,开发者可以有效减轻 DO{过滤}M 负担,提升滚动性能和用户体验。在现代 Web 应用中,高效的数据处理和优化的渲染技术是必不可少的。这些方法为开发者提供了强大的工具,使得构建响应迅速、性能优良的应用变得更加容易。

希望本文能帮助你更好地理解和应用这些技术,以便在实际项目中实现性能优化,提供出色的用户体验。