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

vue中实现图片懒加载的几种方法

Vue-lazyload 是一个基于 Vue.js 的图片懒加载库,它的实现原理是基于 Intersection Observer API。Intersection Observer API 是一种异步观察目标元素与其祖先元素或顶级文档视窗交叉状态的方式。

Vue-lazyload 的实现原理如下:

  1. 在需要懒加载的图片元素上添加一个自定义指令 v-lazy,并将其参数传递给 Vue-lazyload 组件。
  2. Vue-lazyload 组件通过 Intersection Observer API 监听目标元素的交叉状态,即当目标元素进入可视区域时触发回调函数。
  3. 在回调函数中,Vue-lazyload 组件会通过 $emit 触发一个加载事件,通知父组件加载图片。
  4. 父组件在接收到加载事件后,会通过 $src 或者其他方式设置图片的真实路径,完成图片的加载。

     通过这种方式,Vue-lazyload 可以实现图片的懒加载,即在图片进入可视区域时才加载,从而提高页面加载速度和性能。

一、使用Vue本身的指令

Vue本身提供了一个指令v-lazy,可以实现图片懒加载。使用方式如下:

<img v-lazy="imageSrc" />

其中,imageSrc是需要懒加载的图片路径。当图片进入可视区域时,Vue会自动加载图片。

二、使用第三方库(推荐)

vue社区中有许多第三方库可以实现图片懒加载,例如vue-lazyload、vue-lazyload-enhanced等。这些库提供了更多的配置项和功能,可以满足更多的需求。使用方式如下:

2.1  安装下载

npm i vue-lazyload@1.2.3 -S

2.2  main.js 导入

import VueLazyload from 'vue-lazyload'Vue.use(VueLazyLoad, {// 可选配置项,可省略error: require('./error.jpg'), // 加载失败时显示的图片loading: require('./loading.gif'), // 加载中时显示的图片preLoad: 1.3, // 预加载高度的比例attempt: 3 // 尝试加载次数
}) 

2.3  页面使用

<template>  <div>  <img v-lazy="imageSrc" />  </div>  
</template>  <script>   
import Vue from 'vue'       // main.js 已引入的可忽略
import VueLazyload from 'vue-lazyload'  // main.js 已引入的可忽略
Vue.use(VueLazyload, {      // main.js 已引入的可忽略 // 配置项...  
})  
</script>// 个人实操使用,可参考
<template><div class="scroll-container"><div class="demo-image__lazy"><img v-for="(url, index) in imgUrl" :key="index" v-lazy="url" /> // 遍历图片</div></div>
</template><script>export default {data() {return {imgUrl: [  // 需要显示的所有图片require('@/assets/help/1.jpg'),require('@/assets/help/2.jpg'),require('@/assets/help/3.jpg'),require('@/assets/help/4.jpg'),require('@/assets/help/5.jpg'),],}},}
</script>
<style lang="less" scoped> // 根据视口大小显示图片宽度@media screen and (max-width: 1200px) {.demo-image__lazy img {width: 100%;}}@media screen and (min-width: 1200px) {.demo-image__lazy img {width: 50%;}}
</style>

 三、自定义指令

除了使用Vue本身的指令和第三方库外,还可以通过自定义指令来实现图片懒加载。在自定义指令中,可以通过Intersection Observer API来监听目标元素的交叉状态,从而实现图片的懒加载。使用方式如下:

<template>  <div>  <img v-lazyload="imageSrc" />  </div>  
</template>  <script>  
export default {  directives: {  lazyload: {  inserted: function (el, binding) {  const observer = new IntersectionObserver(([entry]) => {  if (entry.isIntersecting) {  const img = new Image()  img.src = binding.value  el.appendChild(img)  observer.unobserve(el)  }  }, {threshold: 0.1})  observer.observe(el)  }  }  }  
}  
</script>

相关文章:

  • 扭矩传感器信号模拟地、数据地与电源地
  • Docker 中的端口
  • 批量重命名软件推荐 A Better Finder Rename 12最新 for mac
  • Mysql开启binlog 和 打开gtid_mode
  • 【蓝桥杯软件赛 零基础备赛20周】第3周——填空题
  • 异步方法、async/await逃离回调地狱(Callback Hell)
  • 四川芸鹰蓬飞商务信息咨询有限公司是可靠的选择
  • 头哥实践平台之MapReduce基础实战
  • ARM64 linux并发与同步之经典自旋锁
  • 老师的保命大法
  • 海康摄像机导入自主开发应用
  • day17_多线程基础
  • Spring6(一):入门案例
  • 提莫的idea的bug是真滴多
  • 前端面试题 计算机网络
  • 5、React组件事件详解
  • extract-text-webpack-plugin用法
  • Facebook AccountKit 接入的坑点
  • gops —— Go 程序诊断分析工具
  • HTTP 简介
  • Javascript弹出层-初探
  • JDK9: 集成 Jshell 和 Maven 项目.
  • php面试题 汇集2
  • Vue全家桶实现一个Web App
  • 回流、重绘及其优化
  • 机器学习学习笔记一
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 入口文件开始,分析Vue源码实现
  • 深度学习入门:10门免费线上课程推荐
  • 深入浅出webpack学习(1)--核心概念
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • 大数据全解:定义、价值及挑战
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • ​MySQL主从复制一致性检测
  • #13 yum、编译安装与sed命令的使用
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • #ubuntu# #git# repository git config --global --add safe.directory
  • (23)Linux的软硬连接
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (a /b)*c的值
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (二)Linux——Linux常用指令
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • (轉貼)《OOD启思录》:61条面向对象设计的经验原则 (OO)
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .NET 中让 Task 支持带超时的异步等待
  • .NET版Word处理控件Aspose.words功能演示:在ASP.NET MVC中创建MS Word编辑器
  • .NET值类型变量“活”在哪?
  • /deep/和 >>>以及 ::v-deep 三者的区别
  • /usr/local/nginx/logs/nginx.pid failed (2: No such file or directory)