结合vueuse实现图片懒加载

介绍

为什么要有懒加载?

在一个网页中如果有很多张图片,那么用户初进这个页面的时候不必一次性把所有图片都加载出来,否则容易造成卡顿和浪费。应该是,用户的视图页面滑到该图片的位置,然后再把该图片加载出来。

前置知识

自定义指令

在 Vue.js 中,app.directive 是用于注册自定义指令的 API。自定义指令允许你在组件的模板中实现特定的功能或行为,这些功能或行为通常是 DOM 操作。

1. 什么是自定义指令?

自定义指令是一种可以在模板中使用的功能,通常以 v- 开头。例如,v-modelv-bind 是内置指令。通过创建自定义指令,你可以扩展 Vue 的功能。

2. 使用 app.directive

在 Vue 3 中,使用 app.directive 注册自定义指令的基本语法如下:

const app = Vue.createApp({});app.directive('directive-name', {// 指令的钩子函数mounted(el, binding) {// 在元素被挂载时调用},updated(el, binding) {// 在元素更新时调用},unmounted(el) {// 在元素卸载时调用}
});

3. 示例

以下是一个简单的自定义指令示例,创建一个 v-focus 指令,使得绑定该指令的元素在页面加载时自动获得焦点:

const app = Vue.createApp({});app.directive('focus', {mounted(el) {el.focus(); // 元素挂载后自动获得焦点}
});app.component('my-component', {template: `<input v-focus placeholder="I will be focused on load" />`
});app.mount('#app');

4. 指令的钩子

常用的钩子函数包括:

  • created: 指令被创建时调用。
  • beforeMount: 指令要被绑定到元素上之前调用。
  • mounted: 指令绑定到元素上之后调用。
  • updated: 被绑定的元素更新时调用。
  • beforeUnmount: 指令要被解绑之前调用。
  • unmounted: 指令解绑后调用。

总结

  • app.directive: 用于注册自定义指令。
  • 自定义指令: 可以在模板中添加特定的功能,增强组件的交互性。
  • 钩子函数: 提供不同生命周期阶段的操作机会。

VueUse

VueUse 是一个为 Vue.js 提供的实用工具库,旨在帮助开发者更高效地构建应用。它包含了一系列可复用的组合式 API(composables),使得在 Vue 应用中使用常见功能变得更加简单和快捷。

懒加载用到了useIntersectionObserver,作用是检测图片是否在视口内。

<script setup>
import { useIntersectionObserver } from '@vueuse/core'
import { ref } from 'vue'const target = ref(null)
const targetIsVisible = ref(false)const { stop } = useIntersectionObserver(target,([{ isIntersecting }], observerElement) => {targetIsVisible.value = isIntersecting},
)
</script><template><div ref="target"><h1>Hello world</h1></div>
</template>

例子

main.js

// 定义全局指令
app.directive('img-lazy', {mounted(el, binding) {// el: 指令绑定的那个元素 (即 img 元素)// binding: binding.value 指令等于号后面绑定的表达式的值 (图片 URL)console.log(el, binding.value); // 输出当前元素和绑定的图片 URLconst{stop} = useIntersectionObserver(el,([{ isIntersecting }]) => {console.log(isIntersecting); // 输出当前的可见性状态if (isIntersecting) { // 如果元素进入视口el.src = binding.value; // 将 img 元素的 src 属性设置为绑定的图片 URLstop();//停止监听,否则会重复请求}},);}
});
  1. 定义全局指令:

    • 使用 app.directive 方法定义一个名为 img-lazy 的指令。
  2. mounted 生命周期钩子:

    • 当指令被绑定到元素时,会调用 mounted 钩子。这里的 el 是指令绑定的 DOM 元素(在这个例子中是 <img> 标签),binding 是一个对象,包含指令的相关信息。
  3. 输出调试信息:

    • console.log(el, binding.value) 会打印出当前被绑定的元素(el)和指令传入的值(通常是图片的 URL)。
  4. 使用 Intersection Observer:

    • 调用 useIntersectionObserver 函数来创建一个观察者,该观察者会监测 el(即图片元素)的可见性。
    • ([ { isIntersecting } ]) 是解构赋值,从回调函数的参数中提取出 isIntersecting,它表示元素是否在视口内。
  5. 判断元素是否在视口内:

    • 如果 isIntersecting 为 true,意味着图片元素进入了可视区域。
    • 此时,将 el.src 设置为 binding.value,即将图片的 src 属性更新为指令绑定的 URL,从而加载图片。

在别的组件

<img v-img-lazy="item.picture" alt="" />

解释

  1. <img> 标签:

    • 这是一个 HTML 元素,用于显示图片。
  2. 指令 v-img-lazy:

    • 这是你定义的自定义指令,名为 img-lazy。通过前缀 v- 来标识它是 Vue 的指令。
    • 这里使用 v-img-lazy 是为了实现懒加载效果,使得图片在用户滚动到视口时才会被加载。
  3. item.picture:

    • 这是绑定到指令的值,通常在 Vue 组件的数据中 item 是一个对象,picture 是该对象的一个属性,表示图片的 URL。
    • 例如,如果 item 是 { picture: 'http://example.com/image.jpg' },那么 item.picture 就是 'http://example.com/image.jpg'
  4. alt="" 属性:

    • alt 属性用于提供替代文本,以便在图片无法加载或用户使用屏幕阅读器时显示。这是一个良好的无障碍设计实践。

整体流程

当这行代码渲染到页面时,以下步骤会发生:

  1. 指令初始化:

    • 当 Vue 渲染这个 img 标签时,会调用 v-img-lazy 指令的 mounted 钩子。
  2. 传递值:

    • 在 mounted 钩子中,el 是指这个 <img> 元素,binding.value 将会是 item.picture 的值(即图片的 URL)。
  3. 设置观察者:

    • 使用 useIntersectionObserver 函数监测这个图片元素的可见性。
  4. 懒加载逻辑:

    • 当用户滚动页面,且 <img> 元素进入视口时,isIntersecting 会变为 true,此时指令会将 <img> 的 src 属性设置为 item.picture,从而加载图片。

总结

简单来说,这段代码的目的是确保只有当用户滚动到 <img> 元素所在的位置时,浏览器才会请求并加载该图片,从而提高页面性能,减少初始加载时间。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/438058.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vmvare虚拟机centos 忘记超级管理员密码怎么办?

vmvare虚拟机centos 忘记超级管理员密码怎么办?如何重置密码呢? 一、前置操作 重启vmvare虚拟机的过程中,长按住Shift键 选择第一个的时候,按下按键 e 进入编辑状态。 然后就会进入到类似这个界面中。 在下方界面 添加 init=/bin/sh,然后按下Ctrl+x进行保存退出。 init=/bi…

iPhone、iPad、iOS储存空间不足,瘦身终极方法

如果你实在是需要瘦身&#xff0c;但是确实没有什么可以删除了&#xff0c;也不想备份到其他地方&#xff0c;就这样做。 删除不需要的自带应用。 你可以删除FaceTime、股票、等app&#xff0c;但是不要删除你需要的app。 删除的界限是这样的&#xff1a;你永远都不可能使用…

OceanBase企业级分布式关系数据库

简介 OceanBase 数据库是阿里巴巴和蚂蚁集团不基于任何开源产品&#xff0c;完全自研的原生分布式关系数据库软件&#xff0c;在普通硬件上实现金融级高可用&#xff0c;首创“三地五中心”城市级故障自动无损容灾新标准&#xff0c;具备卓越的水平扩展能力&#xff0c;全球首…

Git版本控制工具--关于命令

Git版本控制工具 学习前言 在项目开发中&#xff0c;总是需要多个人同时对一个项目进行修改&#xff0c;如何高效快速地进行修改&#xff0c;且控制各自修改的版本不会和他人的进行重叠&#xff0c;这就需要用到Git分布式版本控制器了 作用 解决了一致性&#xff0c;并发性…

CSS 圆形边框与阴影

目录 1. 圆角边框 1.1 正圆 1.2 圆角矩形 1.3 任意圆角 1.4 某个圆角 2. 盒子阴影 3. 文字阴影 1. 圆角边框 1.1 正圆 1.2 圆角矩形 1.3 任意圆角 1.4 某个圆角 2. 盒子阴影 3. 文字阴影

Megabit兆比特10月比特币激增做好准备-最新加密货币新闻

Kaiko Research最近的分析表明&#xff0c;交易员正在积极为潜在的强劲表现做好准备特币(BTC)比今年十月。目前&#xff0c;BTC的交易价格为60800美元&#xff0c;在测试了60000美元的支撑位后&#xff0c;最近上涨了800美元。Megabit兆比特自成立以来,Megabit凭借用户友好的界…

【Spring】运行Spring Boot项目,请求响应流程分析以及404和500报错

1. 运行项目 import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Appl…

【设计模式-职责链】

定义 职责链模式是一种行为设计模式&#xff0c;**它通过将请求发送给链上的多个处理者来避免请求发送者与处理者之间的紧密耦合。每个处理者可以选择处理请求或将其传递给链中的下一个处理者。**这样&#xff0c;可以将处理请求的责任链式组织&#xff0c;从而实现更灵活的请…

【HDP】zookeeper未授权漏洞修复

目录 一、禁用四字命令 二、ZK-Client增加kerberos 一、禁用四字命令 Zookeeper四字命令的使用方式非常简单&#xff0c;通常有两种方式。第一种是通过Telnet方式&#xff0c;使用Telnet客户端登录ZooKeeper的对外服务端口&#xff0c;然后直接使用四字命令即可&#xff1b;第…

django的URL配置

1 django如何处理一个请求 首先Django要使用根URLconf模块&#xff0c;通过setting.py配置文件的ROOT_URLCONF来设置。 加载该模块后并查找变量 urlpatterns。这是一个Python的django.conf.urls.url()实例列表。 Django按顺序运行每个URL模式&#xff0c;并在匹配所请求的…

.NET Core 高性能并发编程

一、高性能大并发架构设计 .NET Core 是一个高性能、可扩展的开发框架&#xff0c;可以用于构建各种类型的应用程序&#xff0c;包括高性能大并发应用程序。为了设计和开发高性能大并发 .NET Core 应用程序&#xff0c;需要考虑以下几个方面&#xff1a; 1. 异步编程 异步编程…

Windows平台如何实现RTSP|RTMP流录像?

好多开发者使用场景&#xff0c;除了实现基础的低延迟RTSP、RTMP播放外&#xff0c;还需要实现RTSP、RTMP流数据的本地录像功能。本文以大牛直播SDK的Windows平台播放模块为例&#xff0c;介绍下如何实现RTSP、RTMP流录像。 功能设计 [拉流]支持拉取RTSP流录像&#xff1b; [拉…

15分钟学 Python 第34天 :小项目-个人博客网站

Day 34: 小项目-个人博客网站 1. 引言 随着互联网的普及&#xff0c;个人博客已成为分享知识、体验和见解的一个重要平台。在这一节中&#xff0c;我们将使用Python的Flask框架构建一个简单的个人博客网站。我们将通过实际的项目来学习如何搭建Web应用、处理用户输入以及管理…

二叉树深度学习——将二叉搜索树转化为排序的双向链表

1.题目解析 题目来源&#xff1a;LCR 155.将二叉搜索树转化为排序的双向链表 测试用例 2.算法原理 首先题目要求原地进行修改并且要求左指针代表前驱指针&#xff0c;右指针代表后继指针&#xff0c;所以思路就是 1.使用前序遍历创建两个指针cur、prev代表当前节点与前一个节点…

游览器输入URL并Enter时都发生了什么 面试完美回答

文章目录 前言URL解析DNS解析**浏览器缓存****操作系统缓存**&#xff1a;**路由器缓存**&#xff1a;ISP&#xff08;Internet service provider&#xff09;缓存DNS递归解析IP地址的获取缓存结果 建立TCP连接发送HTTP请求服务器响应TCP链接断开渲染页面解析一 HTML解析过程解…

U盘目录损坏数据恢复全攻略

一、U盘目录损坏现象描述 U盘作为我们日常生活中常用的存储设备&#xff0c;因其小巧便携、存储容量大等特点而备受青睐。然而&#xff0c;在使用U盘的过程中&#xff0c;有时会遇到目录损坏的问题。目录损坏通常表现为U盘中的文件夹无法正常打开&#xff0c;或者文件无法读取…

云栖实录 | 开源大数据全面升级:Native 核心引擎、Serverless 化、湖仓架构引领云上大数据发展

本文根据2024云栖大会实录整理而成&#xff0c;演讲信息如下&#xff1a; 演讲人&#xff1a; 王 峰 | 阿里云智能集团研究员、开源大数据平台负责人 李 钰&#xff5c;阿里云智能集团资深技术专家 范 振&#xff5c;阿里云智能集团高级技术专家 李劲松&#xff5c;阿里云…

docker部署minio文件服务器

1. 拉取镜像 docker search minio docker pull minio/minio2. 创建映射 mkdir -p /root/docker_app/minio_data mkdir -p /root/docker_app/minio_config3. 执行docker run 自定义用户和秘钥安装: admin/admin123456 docker run -p 9000:9000 -p 9001:9001 -d --name mini…

【有啥问啥】大型语言模型的涌现能力(Emergent Abilities):新一代AI的曙光

大型语言模型的涌现能力&#xff08;Emergent Abilities&#xff09;&#xff1a;新一代AI的曙光 随着人工智能技术的飞速发展&#xff0c;大型语言模型&#xff08;Large Language Model&#xff0c;LLM&#xff09;展现出了令人惊叹的涌现能力。这种能力并非模型规模简单线性…

Unity3D播放GIF图片使用Animation来制作动画

系列文章目录 unity工具 文章目录 系列文章目录👉前言👉一、下载GIF动图,用PS制作导出帧动画图片👉二、使用Animation制作动画👉三、脚本控制动画播放👉壁纸分享👉总结👉前言 unity播放gif图片,本身是不支持的,但是可以使用其他方法来实现, 1.有一种使用System…