当前位置: 首页 > news >正文

结合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> 元素所在的位置时,浏览器才会请求并加载该图片,从而提高页面性能,减少初始加载时间。

相关文章:

结合vueuse实现图片懒加载

介绍 为什么要有懒加载&#xff1f; 在一个网页中如果有很多张图片&#xff0c;那么用户初进这个页面的时候不必一次性把所有图片都加载出来&#xff0c;否则容易造成卡顿和浪费。应该是&#xff0c;用户的视图页面滑到该图片的位置&#xff0c;然后再把该图片加载出来。 前置…...

Mysql数据库--聚合查询、分组查询、联合查询(不同的连接方式)

文章目录 1.查询的进阶版1.1查询搭配插入进行使用1.2聚合查询1.3group by分组查询1.4联合查询之笛卡尔积1.5左外连接&#xff0c;右外连接介绍join on1.6自连表 1.查询的进阶版 1.1查询搭配插入进行使用 我们首先创建两张表&#xff0c;一个叫做student,一个叫做student2,两个…...

计算机视觉——图像修复综述篇

目录 1. Deterministic Image Inpainting 判别器图像修复 1.1. sigle-shot framework (1) Generators (2) training objects / Loss Functions 1.2. two-stage framework 2. Stochastic Image Inpainting 随机图像修复 2.1. VAE-based methods 2.2. GAN-based methods …...

集中式架构和分布式架构

数据是企业的核心资产和战略资源。面对爆炸性的数据增长&#xff0c;如何有效地组织、管理和利用数据成为企业的重大挑战。数据架构作为企业数据管理的蓝图和框架&#xff0c;发挥重要作用。本文就来详细说下当下主流的两种数据架构的类型。 首先明确数据架构定义&#xff1a;…...

Redis: 集群高可用之故障转移和集群迁移

故障转移 故障转移&#xff0c;包括自动故障转移和手动故障转移 1 &#xff09;自动故障转移 Redis 集群&#xff0c;主节点挂了&#xff0c;从节点可以顶上来继续提供服务常用制造故障的两种方式 第一&#xff0c;对其中一个节点进行 SHUTDOWN 操作第二&#xff0c;kill 掉…...

记账软件在线、会计记账网站、财务记账官网、记账云、云记账、在线免费做账以及易舟云财务软件

记账软件在线、会计记账网站、财务记账官网、记账云、云记账、在线免费做账以及易舟云财务软件&#xff0c;以下是一些详细的介绍和推荐&#xff1a; 一、记账软件在线与会计记账网站 记账软件和会计记账网站是现代财务管理中不可或缺的工具&#xff0c;它们能够帮助企业或个人…...

Elasticsearch基础_3.基础操作

文章目录 一、索引操作1.1、创建索引1.2、删除索引 二、映射操作2.1、查看映射2.2、扩展映射 三、文档操作3.1、单条写入文档3.2、更新单条文档3.3、查看单条文档3.4、删除单条文档3.5、根据条件删除文档 一、索引操作 1.1、创建索引 PUT /${index_name} {"settings&quo…...

PHP永久性Cookie的含义

PHP中的永久性Cookie&#xff08;也称为持久性Cookie&#xff09;是指在用户的计算机上存储的一种持久性的HTTP Cookie。与常规的临时Cookie不同&#xff0c;永久性Cookie在浏览器关闭后依然保留&#xff0c;并且可以在用户下次访问该网站时被读取和使用。 主要特点 持久存储…...

瑜伽培训行业为何要搭建自己的专属知识付费小程序平台?集师知识付费系统 集师知识付费小程序 集师知识服务系统 集师线上培训系统

在当今快节奏的生活中&#xff0c;瑜伽作为一种舒缓压力、增强体质的生活方式&#xff0c;受到了越来越多人的青睐。瑜伽培训行业也随之蓬勃发展&#xff0c;但如何在激烈的市场竞争中脱颖而出&#xff0c;成为众多瑜伽培训机构面临的一大挑战。搭建自己的专属知识付费小程序平…...

FFT 分析进阶-笔记

FFT 分析进阶 边界不连续与泄漏效应解决方法增加窗函数海宁窗与哈布什窗混叠效应频率高到什么程度会出现混叠现象呢&#xff1f;那我们有办法去应对这个混叠吗&#xff1f;经典平均指数平均关于结果的显示模式FFT计算的三个常见的范例计算FFT图谱中某一段的总值&#xff0c;图中…...

毕业设计_基于springboot+layui+mybatisPlus的中小型仓库物流管理系统源码+SQL+教程+可运行】41004

毕业设计_基于springbootlayuimybatisPlus的中小型仓库物流管理系统源码SQL教程可运行】41004 下载地址&#xff1a; https://download.csdn.net/download/qq_24428851/89843203 技术栈 后端&#xff1a;springboot、mybatis-plus、shiro 前端&#xff1a;layUI 存储&…...

ROS基础入门——实操教程

ROS基础入门——实操教程 前言 本教程实操为主&#xff0c;少说书。可供参考的文档中详细的记录了ROS的实操和理论&#xff0c;只是过于详细繁杂了&#xff0c;看得脑壳疼&#xff0c;于是做了这个笔记。 Ruby Rose&#xff0c;放在这里相当合理 本文初编辑于2024年10月4日 C…...

etcd 快速入门

简介 随着go与kubernetes的大热&#xff0c;etcd作为一个基于go编写的分布式键值存储&#xff0c;逐渐为开发者所熟知&#xff0c;尤其是其还作为kubernetes的数据存储仓库&#xff0c;更是引起广泛专注。 本文我们就来聊一聊etcd到底是什么及其工作机制。 首先&#xff0c;…...

Spring MVC__HttpMessageConverter、拦截器、异常处理器、注解配置SpringMVC、SpringMVC执行流程

目录 一、HttpMessageConverter1、RequestBody2、RequestEntity3、ResponseBody4、SpringMVC处理json5、SpringMVC处理ajax6、RestController注解7、ResponseEntity7.1、文件下载7.2、文件上传 二、拦截器1、拦截器的配置2、拦截器的三个抽象方法3、多个拦截器的执行顺序 三、异…...

GAMES101(19节,相机)

相机 synthesis合成成像&#xff1a;比如光栅化&#xff0c;光线追踪&#xff0c;相机是capture捕捉成像&#xff0c; 但是在合成渲染时&#xff0c;有时也会模拟捕捉成像方式&#xff08;包括一些技术 动态模糊 / 景深等&#xff09;&#xff0c;这时会有涉及很多专有名词&a…...

Django Nginx+uwsgi 安装配置

Django Nginx+uwsgi 安装配置 本文将详细介绍如何在Linux环境下安装和配置Django应用程序,使用Nginx作为Web服务器和uwsgi作为应用程序服务器。我们将覆盖以下主题: 安装Python和相关库安装和配置Django安装Nginx安装和配置uwsgi配置Nginx以使用uwsgi测试和调试1. 安装Pytho…...

oracle数据备份和导入

一、数据导出 创建目录对象&#xff1a; CREATE DIRECTORY dpump_dir AS /path/to/your/directory;授予权限&#xff1a; GRANT READ, WRITE ON DIRECTORY dpump_dir TO test_user; #导出的用户导出全库数据 expdp your_user/your_password DIRECTORYdpump_dir DUMPFILEfu…...

C++ | Leetcode C++题解之第452题用最少数量的箭引爆气球

题目&#xff1a; 题解&#xff1a; class Solution { public:int findMinArrowShots(vector<vector<int>>& points) {if (points.empty()) {return 0;}sort(points.begin(), points.end(), [](const vector<int>& u, const vector<int>&…...

react-问卷星项目(3)

项目实战 React Hooks 缓存&#xff0c;性能优化&#xff0c;提升时间效率&#xff0c;但是不要为了技术而优化&#xff0c;应该是为了业务而进行优化 内置Hooks保证基础功能&#xff0c;灵活配合实现业务功能&#xff0c;抽离公共部分&#xff0c;自定义Hooks或者第三方&am…...

69 BERT预训练_by《李沐:动手学深度学习v2》pytorch版

系列文章目录 文章目录 系列文章目录NLP里的迁移学习Bert的动机Bert架构对输入的修改五、预训练任务1、2、3、 六、1、2、3、 七、1、2、3、 八、1、2、3、 NLP里的迁移学习 之前是使用预训练好的模型来抽取词、句子的特征&#xff0c;例如 word2vec 或语言模型这种非深度学习…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包&#xff1a;import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序&#xff08;自然排序和定制排序&#xff09;Arrays.binarySearch()通过二分搜索法进行查找&#xff08;前提&#xff1a;数组是…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状&#xff1a;装配工作依赖人工经验&#xff0c;装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书&#xff0c;但在实际执行中&#xff0c;工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...