在Vue3中实现懒加载功能的代码示例

 更新时间:2024年09月22日 16:07:03   作者:JJCTO袁龙  
在现代前端开发中,懒加载是一种提高应用性能和用户体验的重要技术,尤其是在处理较大图片或长列表数据时,本文将使用 Vue 3 和其新推出的 setup 语法糖来实现懒加载功能,并提供具体的示例代码,需要的朋友可以参考下

在 Vue 3 中实现懒加载功能

在现代前端开发中,懒加载是一种提高应用性能和用户体验的重要技术,尤其是在处理较大图片或长列表数据时。懒加载意味着仅在用户需要时才加载资源,这有助于减少初始加载时间和提升响应速度。本文将使用 Vue 3 和其新推出的 setup 语法糖来实现懒加载功能,并提供具体的示例代码,帮助大家更好的理解。

一、懒加载的原理

懒加载的基本原理是通过 JavaScript 监测视口,一旦用户滚动到某个元素时才去加载该元素的内容。例如,在一个包含大量图片的页面中,初始加载时只加载可见部分的图片,用户下滚时再加载其余图片。

二、准备工作

首先,我们需要创建一个新的 Vue 3 项目。如果你还没有项目,可以使用以下命令通过 Vue CLI 创建一个新的项目:

npm install -g @vue/cli
vue create lazy-load-demo
cd lazy-load-demo
npm run serve

接下来,安装 Intersection Observer,虽然这个 API 是原生支持的,但为了更好地支持老旧浏览器,我们可以使用一个 polyfill:

npm install intersection-observer

在你的 main.js 文件中引入此 polyfill:

import 'intersection-observer';

三、实现懒加载组件

我们将创建一个名为 LazyLoadImage.vue 的组件,利用 Intersection Observer 来实现懒加载。创建组件文件:

<template>
  <div ref="imageRef" class="lazy-load-image">
    <img
      v="isVisible"
      :src="src"
      :alt="alt"
      @load="onLoad"
      @error="onError"
    />
    <div v-else class="placeholder">Loading...</div>
  </div>
</template>

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

export default {
  props: {
    src: {
      type: String,
      required: true,
    },
    alt: {
      type: String,
      default: 'Image',
    },
  },
  setup(props) {
    const imageRef = ref(null);
    const isVisible = ref(false);
    let observer = null;

    const loadImage = (entries) => {
      entries.forEach(entry => {
        if (entry.isIntersecting) {
          isVisible.value = true; // Set the image to be visible
          observer.unobserve(entry.target); // Unobserve after loading
        }
      });
    };

    onMounted(() => {
      observer = new IntersectionObserver(loadImage);
      if (imageRef.value) {
        observer.observe(imageRef.value); // Observe the image element
      }
    });

    onBeforeUnmount(() => {
      if (observer && imageRef.value) {
        observer.unobserve(imageRef.value); // Clean up on unmount
      }
    });

    return {
      imageRef,
      isVisible,
    };
  },
};
</script>

<style scoped>
.lazy-load-image {
  width: 100%;
  height: auto;
  position: relative;
}

.placeholder {
  width: 100%;
  height: 200px; /* Specify a height for the placeholder */
  display: flex;
  align-items: center;
  justify-content: center;
  background: #f0f0f0;
}
</style>

在这个 LazyLoadImage 组件中,我们接受两个参数:src 和 alt。组件的原理是通过 IntersectionObserver API 监听元素的可见性,当图片进入视口时,我们就更新 isVisible 变量为 true,从而显示图片。如果不在视口,我们显示一个加载的占位符。

四、使用懒加载组件

现在我们将使用 LazyLoadImage 组件来实现一个懒加载的图片列表。

在你的 App.vue 文件中,添加如下代码:

<template>
  <div class="image-list">
    <LazyLoadImage
      v-for="(image, index) in images"
      :key="index"
      :src="image.src"
      :alt="image.alt"
    />
  </div>
</template>

<script>
import LazyLoadImage from './components/LazyLoadImage.vue';

export default {
  components: {
    LazyLoadImage,
  },
  data() {
    return {
      images: [
        { src: 'https://placekitten.com/800/600', alt: 'Cat 1' },
        { src: 'https://placekitten.com/801/600', alt: 'Cat 2' },
        { src: 'https://placekitten.com/802/600', alt: 'Cat 3' },
        { src: 'https://placekitten.com/803/600', alt: 'Cat 4' },
        { src: 'https://placekitten.com/804/600', alt: 'Cat 5' },
        // 可以添加更多图片
      ],
    };
  },
};
</script>

<style>
.image-list {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
}
</style>

在这个组件中,我们导入了 LazyLoadImage 并使用 v-for 来循环渲染多个图片。每张图片会在进入视口时才会懒加载,减少了性能开销。

五、总结

使用 Vue 3 的 setup 语法糖和原生的 Intersection Observer,我们可以很容易地实现懒加载功能。懒加载不仅可以提升用户体验,还能显著提高页面的性能,尤其是在处理大量图片或数据时。

你可以根据需要自定义懒加载组件,比如添加加载动画、错误处理以及占位符样式等。

到此这篇关于在Vue3中实现懒加载功能的代码示例的文章就介绍到这了,更多相关Vue3实现懒加载内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Vue组件上使用v-model之单选框

    Vue组件上使用v-model之单选框

    这篇文章主要介绍了Vue组件上使用v-model之单选框,代码分为子组件内容和父组件内容,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-10-10
  • typescript中this报错的解决

    typescript中this报错的解决

    这篇文章主要介绍了typescript中this报错的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • vue ssr服务端渲染(小白解惑)

    vue ssr服务端渲染(小白解惑)

    这篇文章主要介绍了vue ssr服务端渲染(小白解惑),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • 在Vue 中获取下拉框的文本及选项值操作

    在Vue 中获取下拉框的文本及选项值操作

    这篇文章主要介绍了在Vue 中获取下拉框的文本及选项值操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • Vue CLI3 开启gzip压缩文件的方式

    Vue CLI3 开启gzip压缩文件的方式

    gizp压缩是一种http请求优化方式,通过减少文件体积来提高加载速度。这篇文章主要介绍了Vue CLI3 开启gzip压缩,需要的朋友可以参考下
    2018-09-09
  • Vue 实现新国标红绿灯效果实例详解

    Vue 实现新国标红绿灯效果实例详解

    这篇文章主要为大家介绍了Vue 实现新国标红绿灯效果实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • vuex的module模块用法示例

    vuex的module模块用法示例

    这篇文章主要介绍了vuex的module模块用法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • uniapp使用条件编译#ifdef(跨平台设备兼容)

    uniapp使用条件编译#ifdef(跨平台设备兼容)

    这篇文章主要介绍了uniapp使用条件编译#ifdef(跨平台设备兼容),需要的朋友可以参考下
    2022-12-12
  • 使用vue-i18n 入口文件配置控制台报警问题解决

    使用vue-i18n 入口文件配置控制台报警问题解决

    这篇文章主要介绍了使用vue-i18n 入口文件配置控制台报警问题解决,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • vue页面使用阿里oss上传功能的实例(二)

    vue页面使用阿里oss上传功能的实例(二)

    本篇文章主要介绍了vue页面使用阿里oss上传功能的实例(二),主要介绍OSS管理控制台设置访问权限、角色等,有兴趣的可以了解一下
    2017-08-08

最新评论