Vue实现图片懒加载

图片懒加载(Lazy Loading)是一种前端优化技术,旨在改善网页加载性能和用户体验。它的基本原理是,将网页中的图片延迟加载,只有当用户滚动到图片所在的位置时,才会加载图片内容,从而减少初始页面加载时的网络请求量,加快页面加载速度。

图片懒加载的优势包括:

  1. 减少初始加载时间: 只加载可视区域的图片,减少了初始页面加载所需的时间,提高了用户体验。

  2. 降低网络请求: 不需要一开始就加载所有图片,减少了不必要的网络请求,节省了带宽。

  3. 优化移动设备体验: 在移动设备上,网络速度可能较慢,图片懒加载可以显著提升页面加载速度。

  4. 节省资源: 不加载不可见区域的图片,减少了服务器和客户端的资源消耗。

Vue.js 可以通过使用第三方库或者自定义指令来实现图片的懒加载。

一.第三方库实现

首先,在你的 Vue 项目中安装 vue-lazyload

npm install vue-lazyload --save

在 main.js 中引入和使用

这里是全局的引入,也可以按需引入

import { createApp } from 'vue'
import App from './App.vue'
import VueLazyload from 'vue-lazyload';
const app = createApp(App)
app.use(VueLazyload)
app.mount('#app')

在组件中使用懒加载

在需要懒加载的图片元素上使用 v-lazy 指令,将图片的 src 属性替换成 v-lazy

<template>
  <div>
    <!-- 普通加载的图片 -->
    <img src="normal-image.jpg" alt="Normal Image" />

    <!-- 使用懒加载的图片 -->
    <img v-lazy="lazy-image.jpg" alt="Lazy Loaded Image" />
  </div>
</template>

<script>

</script>

二.自定义指令实现

首先安装VueUse

npm i @vueuse/core

VueUse介绍

 vueuse 是一个为 Vue.js 提供常用功能和自定义组合的库,旨在帮助开发者更轻松地构建 Vue 应用。它提供了一系列的 Composition API 组合函数,用于处理诸如状态管理、副作用、浏览器 API 等常见任务,以及一些自定义的功能。

以下是一些 vueuse 库提供的功能和特性:

  1. 常用 Composition API 函数: vueuse 提供了许多与 Composition API 相关的实用函数,如 useLocalStorage(用于在本地存储中保留状态)、useDebounce(用于防抖处理)、useIntersectionObserver(用于观察元素是否进入视口)、useEventListener(用于添加事件监听器)等等。

  2. 浏览器 API 包装: vueuse 还对浏览器原生 API 进行了封装,使它们更易于在 Vue 应用中使用,如 useMouse(获取鼠标位置)、useGeolocation(获取地理位置信息)、useIdle(检测用户是否处于空闲状态)等。

  3. 状态管理: 除了提供一些状态管理相关的功能外,vueuse 还包括了 useStore,这是一个基于 Composition API 的状态管理工具,可以在应用中更轻松地管理全局状态。

  4. 自定义组合: vueuse 鼓励开发者创建自己的自定义组合,这可以帮助你把常见的逻辑封装成可重用的组合函数,从而简化代码和提高代码的可维护性。

使用该库的 useIntersectionObserver函数,监听图片是否出现在可视区域

 

 封装指令---directives/index.js

import { useIntersectionObserver } from '@vueuse/core'

export const lazyPlugin = {
  install (app) {
    // 懒加载指令逻辑
    app.directive('img-lazy', {
      mounted (el, binding) {
        // el: 指令绑定的那个元素 img
        // binding: binding.value  指令等于号后面绑定的表达式的值  图片url
        console.log(el, binding.value)
        const { stop } = useIntersectionObserver(
          el,
          ([{ isIntersecting }]) => {
            console.log(isIntersecting)
            if (isIntersecting) {
              // 进入视口区域
              el.src = binding.value
              stop()  //当图片已经渲染出来后,停止监听
            }
          },
        )
      }
    })
  }
}
  1. 导入 useIntersectionObserver 这行代码导入了 @vueuse/core 库中的 useIntersectionObserver 函数,它是用来实现 Intersection Observer 的功能,可以用于观察元素是否进入视口。

  2. 定义 lazyPlugin 插件对象: 这个对象有一个 install 方法,用于在 Vue 应用中安装插件。

  3. app.directive('img-lazy', {...}) 这里使用 app.directive 方法来注册一个自定义指令 img-lazy。该指令将在具有 v-img-lazy 属性的图片元素上生效。

  4. mounted 钩子函数: 当绑定了 img-lazy 指令的图片元素被插入到 DOM 中时,mounted 钩子函数会被调用。在这个函数内部,你使用了 useIntersectionObserver 来监测图片元素是否进入视口。

  5. useIntersectionObserver 这个函数的参数包括要观察的元素 el,以及当元素状态变化时的回调函数。回调函数接收一个参数,包含当前的观察结果。在这里,你解构出 isIntersecting 变量,表示元素是否进入视口。

  6. if (isIntersecting) {...} 如果元素进入了视口,就会执行这个条件语句。在这里,你将图片元素的 src 属性设置为 binding.value,即绑定到指令的表达式的值,这通常是图片的 URL。然后调用 stop() 方法停止对元素的可见性变化进行观察。

 全局注册

// 全局指令注册
import {lazyPlugin } from '@/directives/index'
app.use(lazyPlugin)

指令使用

 <img v-img-lazy="cate.picture"/>//cate.picture图片的url

三.效果

当图片未出现在可视区域时

 图片出现在可视区域时

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

QT生成Word PDF文档

需求&#xff1a;将软件处理的结果保存为一个报告文档&#xff0c;文档中包含表格、图片、文字&#xff0c;格式为word的.doc和.pdf。生成word是为了便于用户编辑。 开发环境&#xff1a;qt4.8.4vs2010 在qt的官网上对于pdf的操作介绍如下&#xff1a;http://qt-project.org/…

易服客工作室:Elementor AI简介 – 彻底改变您创建网站的方式

Elementor 作为领先的 WordPress 网站构建器&#xff0c;是第一个添加本机 AI 集成的。Elementor AI 的第一阶段将使您能够生成和改进文本和自定义代码&#xff08;HTML、自定义代码和自定义 CSS&#xff09;。我们还已经在进行以下阶段的工作&#xff0c;其中将包括基于人工智…

2023年游戏买量能怎么玩?

疫情过后&#xff0c;一地鸡毛。游戏行业的日子也不好过。来看看移动游戏收入&#xff1a;2022年&#xff0c;移动游戏收入达到920亿美元&#xff0c;同比下降6.4%。这告诉我们&#xff0c;2022年对移动游戏市场来说是一个小挫折。 但不管是下挫还是上升&#xff0c;移动游戏市…

pytest fixture 用于teardown工作

fixture通过scope参数控制setup级别&#xff0c;setup作为用例之前前的操作&#xff0c;用例执行完之后那肯定也有teardown操作。这里用到fixture的teardown操作并不是独立的函数&#xff0c;用yield关键字呼唤teardown操作。 举个例子&#xff1a; 输出&#xff1a; 说明&…

剑指 Offer 61. 扑克牌中的顺子

题目描述 从若干副扑克牌中随机抽 5 张牌&#xff0c;判断是不是一个顺子&#xff0c;即这5张牌是不是连续的。2&#xff5e;10为数字本身&#xff0c;A为1&#xff0c;J为11&#xff0c;Q为12&#xff0c;K为13&#xff0c;而大、小王为 0 &#xff0c;可以看成任意数字。A 不…

通讯协议038——全网独有的OPC HDA知识一之聚合(七)最小值

本文简单介绍OPC HDA规范的基本概念&#xff0c;更多通信资源请登录网信智汇(wangxinzhihui.com)。 本节旨在详细说明HDA聚合的要求和性能。其目的是使HDA聚合标准化&#xff0c;以便HDA客户端能够可靠地预测聚合计算的结果并理解其含义。如果用户需要聚合中的自定义功能&…

程序使用Microsoft.XMLHTTP对象请求https时出错解决

程序中使用Microsoft.XMLHTTP组件请求https时出现如下错误&#xff1a; 出错程序代码示例&#xff1a; strUrl "https://www.xxx.com/xxx.asp?id11" dim objXmlHttp set objXmlHttp Server.CreateObject("Microsoft.XMLHTTP") objXmlHttp.open "…

SpringCloudGateway配置跨域设置以及如何本地测试跨域

问题背景 有个服务A &#xff0c;自身对外提供服务&#xff0c;几个系统的前端页面也在调用&#xff0c;使用springboot 2.6.8开发的&#xff0c;自身因为有前端直接调用已经配置了跨域。 现在有网关服务&#xff0c;一部分前端通过网关访问服务A&#xff08;因为之前没有网关…

springboot 基础

巩固基础&#xff0c;砥砺前行 。 只有不断重复&#xff0c;才能做到超越自己。 能坚持把简单的事情做到极致&#xff0c;也是不容易的。 SpringBoot JavaEE 简介 JavaEE的局限性&#xff1a; 1、过于复杂&#xff0c;JavaEE正对的是复杂的分布式企业应用&#xff0c;然而现实…

桥接模式-java实现

桥接模式 桥接模式的本质&#xff0c;是解决一个基类&#xff0c;存在多个扩展维度的的问题。 比如一个图形基类&#xff0c;从颜色方面扩展和从形状上扩展&#xff0c;我们都需要这两个维度进行扩展&#xff0c;这就意味着&#xff0c;我们需要创建一个图形子类的同时&#x…

软件测试基础篇——MySQL

MySQL 1、数据库技术概述 数据库database&#xff1a;存放和管理各种数据的仓库&#xff0c;操作的对象主要是【数据data】&#xff0c;科学的组织和存储数据&#xff0c;高效的获取和处理数据SQL&#xff1a;结构化查询语言&#xff0c;专为**关系型数据库而建立的操作语言&…

科技云报道:一波未平一波又起?AI大模型再出邪恶攻击工具

AI大模型的快速向前奔跑&#xff0c;让我们见识到了AI的无限可能&#xff0c;但也展示了AI在虚假信息、深度伪造和网络攻击方面的潜在威胁。 据安全分析平台Netenrich报道&#xff0c;近日&#xff0c;一款名为FraudGPT的AI工具近期在暗网上流通&#xff0c;并被犯罪分子用于编…

基于微信小程序的应届大学生招聘平台的设计与实现

伴随着社会以及科学技术的发展&#xff0c;互联网已经渗透在人们的身边&#xff0c;网络慢慢的变成了人们的生活必不可少的一部分&#xff0c;紧接着众多智能手机飞速的发展&#xff0c;小程序这一名词已不陌生&#xff0c;越来越多的企业、公司、高校、医院等机构都会使用小程…

C++学习笔记——从面试题出发学习C++

C学习笔记——从面试题出发学习C C学习笔记——从面试题出发学习C1. 成员函数的重写、重载和隐藏的区别&#xff1f;2. 构造函数可以是虚函数吗&#xff1f;内联函数可以是虚函数吗&#xff1f;析构函数为什么一定要是虚函数&#xff1f;3. 解释左值/右值、左值/右值引用、std:…

Clickhouse学习系列——一条SQL完成gourp by分组与不分组数值计算

笔者在近一两年接触了Clickhouse数据库&#xff0c;在项目中也进行了一些实践&#xff0c;但一直都没有一些技术文章的沉淀&#xff0c;近期打算做个系列&#xff0c;通过一些具体的场景将Clickhouse的用法进行沉淀和分享&#xff0c;供大家参考。 首先我们假设一个Clickhouse数…

EXPLAIN使用分析

系列文章目录 文章目录 系列文章目录一、type说明二、MySQL中使用Show Profile1.查看当前profiling配置2.在会话级别修改profiling配置3.查看profile记录4.要深入查看某条查询执行时间的分布 一、type说明 我们只需要注意一个最重要的type 的信息很明显的提现是否用到索引&…

单参数构造函数的隐式类型转化

单参数构造函数的隐式类型转化 如果你不想发生隐式类型的转化&#xff0c;可以在默认构造函数前加上关键字&#xff1a;explicit 多参数的玩法和单参数的是不一样的 c98 不支持多参数隐式类型的转化 c11 支持多参数隐式类型的转化 举个例子&#xff1a; 多参数可以这样写&…

考虑分布式电源的配电网无功优化问题研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

计算机视觉中的Transformer

几十年来&#xff0c;理论物理学家一直在努力提出一个宏大的统一理论。通过统一&#xff0c;指的是将被认为是完全不同的两个或多个想法结合起来&#xff0c;将它们的不同方面证明为同一基础现象。一个例子是在19世纪之前&#xff0c;电和磁被看作是无关的现象&#xff0c;但电…

SolidWorks不能使用选择如允许此选择将生成有冲突的前后关系

SolidWorks不能使用选择如允许此选择将生成有冲突的前后关系 1 SolidWorks不能使用选择如允许此选择将生成有冲突的前后关系 1 SolidWorks不能使用选择如允许此选择将生成有冲突的前后关系 https://www.swrjzxw.com/1556.html SolidWorks装配体时 显示 不能使用选择如允许此选…