首页 > 其他分享 >Vue Hook 封装图片懒加载通用业务

Vue Hook 封装图片懒加载通用业务

时间:2024-08-01 20:09:09浏览次数:17  
标签:Vue 封装 observer img Hook images 图片 加载

 

一、什么是图片懒加载

图片懒加载(Lazy Loading)是一种在用户需要的时候(通常是滚动到可视区域)才加载图片的技术。通过这种方式,可以减少页面的初始加载时间,减少带宽消耗,提高用户体验。

二、Vue中使用Intersection Observer实现图片懒加载

Intersection Observer 是一个现代浏览器提供的API,用于异步观察目标元素与其祖先元素或视窗(viewport)交叉状态的变化。我们可以利用这个API来实现图片的懒加载。

三、封装一个通用的图片懒加载 Hook

首先,我们创建一个自定义的 Vue Hook,用于实现图片懒加载功能。

1. 创建 useLazyLoad Hook

src/hooks 目录下创建一个 useLazyLoad.js 文件:

import { ref, onMounted, onUnmounted } from 'vue';

export function useLazyLoad(imageSelector) {
  const images = ref([]);

  const loadImage = (entries, observer) => {
    entries.forEach(entry => {
      if (entry.isIntersecting) {
        const img = entry.target;
        img.src = img.dataset.src;
        observer.unobserve(img);
      }
    });
  };

  const observer = new IntersectionObserver(loadImage, {
    root: null,
    rootMargin: '0px',
    threshold: 0.1,
  });

  onMounted(() => {
    images.value = document.querySelectorAll(imageSelector);
    images.value.forEach(img => {
      observer.observe(img);
    });
  });

  onUnmounted(() => {
    if (images.value.length) {
      images.value.forEach(img => {
        observer.unobserve(img);
      });
    }
  });

  return {
    images,
  };
}

 

2. 使用 useLazyLoad Hook

组件中使用这个 Hook 来实现图片懒加载。

import { ref, onMounted, onUnmounted } from 'vue';

export function useLazyLoad(imageSelector) {
  const images = ref([]);

  const loadImage = (entries, observer) => {
    entries.forEach(entry => {
      if (entry.isIntersecting) {
        const img = entry.target;
        img.src = img.dataset.src;
        observer.unobserve(img);
      }
    });
  };

  const observer = new IntersectionObserver(loadImage, {
    root: null,
    rootMargin: '0px',
    threshold: 0.1,
  });

  onMounted(() => {
    images.value = document.querySelectorAll(imageSelector);
    images.value.forEach(img => {
      observer.observe(img);
    });
  });

  onUnmounted(() => {
    if (images.value.length) {
      images.value.forEach(img => {
        observer.unobserve(img);
      });
    }
  });

  return {
    images,
  };
}

 

四、解释代码

  1. 定义 useLazyLoad Hook

    • 使用 Vue 的 refonMountedonUnmounted 组合 API。
    • loadImage 函数处理图片的实际加载:当图片进入视窗时,设置图片的 src 属性,并停止观察该图片。
    • 使用 IntersectionObserver API 观察图片元素的可见性变化。
  2. 在组件中使用 Hook

    • 使用 ref 定义一个图片列表。
    • 调用 useLazyLoad 并传递图片的选择器(.lazy-load)。
    • 在模板中,使用 v-for 指令渲染图片列表,并使用 data-src 属性存储图片 URL,等待懒加载。

标签:Vue,封装,observer,img,Hook,images,图片,加载
From: https://www.cnblogs.com/zx618/p/18337381

相关文章

  • Vue Hook 封装通用型表格
    一、创建通用型表格的需求实现一个通用型表格组件,具备以下功能:动态列配置。分页功能。排序功能。可扩展的行操作功能。二、设计通用型表格组件首先,需要设计一个基础的表格组件,它接受列配置、数据和分页信息等参数。1.创建useTableHook在src/hooks目录下创建useTa......
  • 对 Vue Hook 的理解和简单案例
    1.VueHook的理解VueHook是在Vue3中引入的一种新的代码组织和状态管理方式,它受到了ReactHook的启发。VueHook主要通过组合式API(CompositionAPI)来实现,让开发者能够更灵活、更高效地管理组件逻辑和状态。2.VueHook的优势1.更好的逻辑复用在选项式API(Op......
  • SpringBoot+Vue物流快递仓库管理系统-附源码与配套论文
    1.1研究背景 随着网络不断的普及发展,物流快递仓库管理系统依靠网络技术的支持得到了快速的发展,首先要从员工的实际需求出发,通过了解员工的需求开发出具有针对性的首页、个人中心、员工管理、客户信息管理、驾驶员管理、仓库管理、配送管理、运输管理管理等功能,利用目前网络给......
  • javascript: vue create project in WebStorm
     route/index.js import{createRouter,createWebHistory,createWebHashHistory}from'vue-router'importHomeViewfrom'../views/HomeView.vue'importAboutViewfrom"../views/AboutView.vue";constrouter=createRouter(......
  • vue el-select实时搜索模糊查询,匹配文字高亮显示
    原文链接:https://blog.csdn.net/weixin_49668076/article/details/122678834参考elementuiselect的远程搜索对应属性的解释<el-selectclass="inputInfo"v-model="searchcursom"filterableclearableremote......
  • 招投标系统VUE网页编辑Word且兼容微软Office和金山WPS支持Electron
    随着信息技术的不断发展,电子政务已经非常普及,电子招投标行业市场规模不断扩大,电子招投标不仅可以减少繁琐的人工操作,提高工作效率,还能保证公开透明的招标流程,制作招标文件过程中,由于微软Office和金山WPS等办公软件无法直接内嵌到浏览器中,有的招标制作工具用的Electron,需要在纯内网......
  • 计算机毕业设计django+vue宠物领养系统【开题+论文+程序】
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着人们生活水平的提高和情感需求的日益增长,宠物已成为许多家庭不可或缺的重要成员。然而,宠物领养市场存在着信息不对称、流程繁琐、匹配......
  • 计算机毕业设计django+vue多彩信管团学管理系统【开题+论文+程序】
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景在高等教育体系中,学生组织如学生会与团委扮演着举足轻重的角色,它们不仅是学生自我管理、自我服务、自我教育的重要平台,也是校园文化建设和......
  • vue播放flv、hls(m3u8)视频及动态切换视频流
    【了解video.js】官方地址: https://github.com/videojs/video.js【用法】1、安装npminstallvideo.js--savenpminstallvideojs-flash--save//rtmp格式//flv格式npminstallflv.js--savenpminstallvideojs-flvjs-es6--save//hls格式video.js7.0以后版本......
  • vue集成svg大图拖拽无限放大缩小
        vue项目中根据实际CAD图为参考,以及参看项目实际现场,手动绘制了一张线体、堆垛机、库区货架svg图,集成到vue页面中,svg图中可以交互接收C#发送过来的singalR实时数据。接收singalR的实时数据并显示到vue中,这里不作展开讲,可以参看笔者另一篇文章《vue若依集成C#的singalR接......