首页 > 其他分享 >在Vue3中实现懒加载功能

在Vue3中实现懒加载功能

时间:2024-08-31 13:52:45浏览次数:12  
标签:src 功能 observer LazyLoadImage Vue3 组件 alt 加载

在 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 组件中,我们接受两个参数:srcalt。组件的原理是通过 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,我们可以很容易地实现懒加载功能。懒加载不仅可以提升用户体验,还能显著提高页面的性能,尤其是在处理大量图片或数据时。

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


最后问候亲爱的朋友们,并邀请你们阅读我的全新著作

书籍详情
在这里插入图片描述

标签:src,功能,observer,LazyLoadImage,Vue3,组件,alt,加载
From: https://blog.csdn.net/yuanlong12178/article/details/141751796

相关文章

  • 前端CSS:CSS雪碧图的作用以及加载方式
    前端CSS:CSS雪碧图的作用以及加载方式引言基本概念和作用说明基本概念作用说明示例一:基础雪碧图制作制作步骤代码示例HTML示例说明示例二:使用伪元素代码示例HTML示例说明示例三:响应式雪碧图代码示例说明示例四:雪碧图的动态加载代码示例说明示例五:雪碧图的自动工具......
  • ✨✨使用jq+layui的layer+laytpl实现横屏查看功能✨✨
    使用jq+layui的layer+laytpl实现横屏查看功能✨一、实现功能......
  • 第七章 项目布局实现(7.4.6)——暗黑模式切换功能
    7.4.6暗黑模式切换功能ElementPlus参考:https://cn.element-plus.org/zh-CN/guide/dark-mode.htmlVueU参考:https://vueuse.org/core/useDark/ElementPlus2.2.0+版本支持暗黑模式,导入暗黑样式文件,然后在index.html的html标签上添加一个class="dark"的类名即可......
  • vue3 jsx响应式渲染变量
    1、JSX渲染变量vue在html代码区渲染变量使用双大括号{{}},jsx在渲染是单大括号{}另外,这里随便记一下一个简单有点绕的业务逻辑2、多个变量影响判断三元表达式根据上图,想要的效果分别是:订单状态是否支付,显示对应状态已支付的订单是否申请开发票,显示对应状态;且已申请的无法......
  • 打造智慧职校宿舍:公寓来访登记功能详解
    在智慧职校的宿舍管理系统中,公寓来访登记功能犹如一道智能的门户,它不仅强化了校园的安全管理,提升了访客的体验,还为学生、教职工以及来访者搭建了一个既便捷又高效的访客管理平台,确保了校园生活秩序井然,和谐共生。智慧职校的宿舍管理系统巧妙地引入了线上预约机制,要求访客提前通过手......
  • Wireshark 4.4 重磅发布!具有重大增强功能
    Wireshark作为一个开源的网络协议分析工具,一直以来都在不断地优化和更新,以满足日益复杂的网络环境和用户需求。2024年8月29日,Wireshark团队发布了最新的4.4版本,Wireshark4.4的发布标志着该工具在性能和功能上的又一次飞跃。此次更新不仅增强了用户的分析能力,还......
  • vue3 导出为Excel文件
    服务端给的一个下载接口:/order/exportOrderOpenInvoice导出转化为ExcelconstexportOrder=async()=>{ letreqData={};  letexportOrderOpenInvoiceUrl="/order/exportOrderOpenInvoice";   try{   constresponse=awaitaxios.get(exportOrderOpenInvo......
  • 一个操作系统的设计与实现——第20章 加载64位内核,64位显卡驱动与内存管理系统
    20.164位ELF格式在64位模式下,由于内存地址变宽,ELF格式中的内存地址也要跟着变宽。这并不是一个麻烦的问题,因为ELF格式的整体结构没有发生变化,仍然由一个文件头,加上若干程序头表组成。对于64位ELF格式的文件头,我们需要关注的信息如下表所示:偏移量字节数含义0x188程......
  • vue3+ts封装一个uniapp的自动滚动列表,实现看板效果
    电视机上要以列表展示数据,并且数据会实时更新,电视机不能点击,所以考虑自动播放的一个效果。展示方案有两种:1、列表上下自动滚动实现轮播效果。(此时具体滚动的高度由用户自己决定,每次滚动几条数据)2、列表以“页”的形式做成轮播图的翻页效果。由于项目的电视机是有任务提示作......
  • Cat2Bug仅这1个功能,让你的Bug解决效率提升3倍
    Bug存活时间越长,代表效率过低。Cat2Bug-Platform的这个功能恰好解决的这个问题。非常Nice!!存活时长功能包括:“Bug的创建、状态变更、存活时长计算”。1、Bug的创建新的Bug提交:系统自动记录创建时间。2、状态变更在Bug的整个生命周期中,支持权限所有者更改其状态:“Open/Close......