全局自定义指令实现图片懒加载,vue2通过js和vueuse的useintersectionObserver实现

整体逻辑:

1.使用全局自定义指令创建图片懒加载指令
2.在全局自定义指令中获取图片距离顶部的高度整个视口的高度
3.实现判断图片是否在视口内的逻辑
在这里插入图片描述

一、使用原生js在vue2中实现图片懒加载

1.创建dom元素,v-lazy为自定义指令,在自定义指令传入图片的url

<!-- 模拟一个循环渲染的例子 -->
<template><div><img v-lazy="imgUrl" style="width: 100px;height: 100px;display: block;" class="lazy-img" alt=""><img v-lazy="imgUrl2" style="width: 100px;height: 100px;display: block;" class="lazy-img" alt=""></div>
</template><script>data () {return {imgUrl:"https://tse1-mm.cn.bing.net/th/id/OIP-C.duz6S7Fvygrqd6Yj_DcXAQHaF7?rs=1&pid=ImgDetMain",imgUrl2:"https://img.zcool.cn/community/01df7b56de44db6ac72531cb2906b9.JPG@3000w_1l_2o_100sh.jpg",}
</script>

2.创建自定义指令,我是将指令封装到单独的directive文件夹里,更符合实际开发场景
在这里插入图片描述
3.在main,js中注册全局自定义指令

import * as directive from '@/directive'
// 开始遍历注册
Object.keys(directive).forEach(key => {Vue.directive(key, directive[key])
})

在这里插入图片描述
4.在directive/index.js中自定义指令中实现图片懒加载逻辑

//1.将判断逻辑封装成方法
const picIsShow = (el,binding)=>{const windowHeight = window.innerHeight//获取视口高度const imgTop = el.getBoundingClientRect().top//获取图片距离顶部高度if(imgTop - windowHeight < 0){//判断是否在视口内el.src = binding.value//将自定义指令传递来的图片url以添加属性的方式赋值给src}}
/*** 2.在指令中监听窗口变化时触发懒加载*/
export const lazy = {inserted: function (el, binding) {picIsShow(el,binding)//窗口加载时window.onload = ()=>{picIsShow(el,binding)}//视口滚动事件window.addEventListener('scroll',()=>{picIsShow(el,binding)})//视口大小变化事件window.addEventListener('resize',()=>{picIsShow(el,binding)})}
}

二、使用vueuse插件的useIntersectionOberver在vue2中实现图片懒加载(超简单开发适用)

官方文档:useIntersectionObserver插件的使用

  1. 安装 @vueuse/core 依赖包
yarn add @vueuse/core 
# 或
npm install @vueuse/core

2.引入插件

import { useIntersectionObserver } from '@vueuse/core'

3.实现

import { useIntersectionObserver } from '@vueuse/core'
export const lazy = {inserted(el,binding){const { stop } = useIntersectionObserver(el,([{ isIntersecting }], observerElement) => {console.log('isIntersecting',isIntersecting)if(isIntersecting){ //el元素是否在视口内el.src = binding.value //是就显示图片}},)}}

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

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

相关文章

vue-selectTree

vue-selectTree并且修改样式和el-select下拉框样式一致。 注意下拉多选&#xff0c;后台数据传参问题。 可拖拽分隔栏&#xff0c; 1.安装依赖 "riophae/vue-treeselect": "0.4.0" 2.工程入口文件main.js全局配置 import Treeselect from riophae/vu…

http模块 获取http请求报文中的路径 与 查询字符串

虽然request.url已包含属性和查询字符串&#xff0c;但使用不便&#xff0c;若只需其中一个不好提取&#xff0c;于是用到了如下路径和字符串的单独查询方法&#xff1a; 一、获取路径 例如&#xff1a;我在启动谷歌端口时输入http://127.0.0.1:9000 后接了 "/search?k…

几个常用的AI工具

人工智能大模型的出现对人类社会产生了深远的影响&#xff0c;这些影响既包括积极的方面&#xff0c;也包括一些潜在的挑战: 1. **提高效率**&#xff1a;AI大模型能够快速处理大量数据&#xff0c;提高工作效率&#xff0c;尤其在数据分析、自然语言处理等领域。 2. **辅助决…

【理解机器学习算法】之Clustering算法(Agglomerative Clustering)

聚合聚类(Agglomerative Clustering)是一种层次聚类算法&#xff0c;通过逐步合并或“聚集”它们来构建嵌套聚类。这种方法采用自底向上的方式构建聚类层次&#xff1a;它从将每个数据点作为单个聚类开始&#xff0c;然后迭代合并最接近的聚类对&#xff0c;直到所有数据点合并…

解决BladeX微服务Swagger资源未授权访问漏洞

1.问题描述 客户线上环境,第三方进行安全检测时候,反馈来一个"Spring"接口未授权访问漏洞。如图: 2.后端框架 服务平台后端采用开源框架BladeX微服务版本。BladeX 是由一个商业级项目升级优化而来的SpringCloud微服务架构,采用Java8 API重构了业务代码,完全遵…

略带个性化的B端界面,非框架生成的。

B端系统&#xff08;即面向企业或机构的系统&#xff09;使用框架搭建页面具有以下优势和劣势&#xff1a; 优势&#xff1a; 提高开发效率&#xff1a;框架提供了一套已经定义好的标准和组件&#xff0c;可以大大减少开发人员的工作量和开发时间。开发人员可以专注于业务逻辑…

人工智能在产业中应用

一、从人工智能说起 (一) 关联关系发现 1. 推荐匹配 在信息爆炸的时代&#xff0c;我们每天都面临着信息的轰炸&#xff0c;无数电影、歌曲、帖子、商品呈现在我们的眼前。海量内容虽然丰富多彩&#xff0c;但同时也让我们感到目不暇接、应接不暇。就在这时&#xff0c;有一…

每日一题 --- 数组中的第 K 个最大元素[力扣][Go]

数组中的第 K 个最大元素 题目&#xff1a;数组中的第 K 个最大元素 给定整数数组 nums 和整数 k&#xff0c;请返回数组中第 k 个最大的元素。 请注意&#xff0c;你需要找的是数组排序后的第 k 个最大的元素&#xff0c;而不是第 k 个不同的元素。 示例 1: 输入: [3,2,1…

蓝桥杯练习题总结(二)dfs题、飞机降落、全球变暖

目录 一、飞机降落 二、全球变暖 初始化和输入 确定岛屿 DFS搜索判断岛屿是否会被淹没 计算被淹没的岛屿数量 三、军训排队 一、飞机降落 问题描述&#xff1a; N架飞机准备降落到某个只有一条跑道的机场。其中第 i 架飞机在 时刻到达机场上空&#xff0c;到达时它的剩余…

qrcode插件-生成二维码

安装 yarn add qrcodejs2 --save npm install qrcodejs2 --save 使用 <template><div><div id"qrcodeImg"></div><!-- 创建一个div&#xff0c;并设置id --></div> </template> <script> import QRCode from q…

一篇文章,告别Flutter状态管理争论,问题和解决

起因 每隔一段时间&#xff0c;都会出现一个新的状态管理框架&#xff0c;最近在YouTube上也发现了有人在推signals, 一个起源于React的状态管理框架&#xff0c;人们总是乐此不疲的发明各种好用或者为了解决特定问题而产生的方案&#xff0c;比如Bloc, 工具会推陈出新&#x…

AI基础知识扫盲

AI基础知识扫盲 AIGCLangchain--LangGraph | 新手入门RAG&#xff08;Retrieval-Augmented Generation&#xff09;检索增强生成fastGPT AIGC AIGC是一种新的人工智能技术&#xff0c;它的全称是Artificial Intelligence Generative Content&#xff0c;即人工智能生成内容。 …

关于SpringMVC返回JSON中时间对象序列化的问题

系列文章目录 文章目录 系列文章目录前言前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 首先要说明一点,SpringMVC进行JSON序列化处理时,使用的工具包是Jackson…

PointNet++论文复现(一)【PontNet网络模型代码详解 - 分类部分】

PontNet网络模型代码详解 - 分类部分 专栏持续更新中!关注博主查看后续部分! 分类模型的训练: ## e.g., pointnet2_ssg without normal features python train_classification.py --model pointnet2_cls_ssg --log_dir pointnet2_cls_ssg python test_classification.py…

云电脑火爆出圈,如何选择和使用?--腾讯云、ToDesk云电脑、青椒云使用评测和攻略

前言&#xff1a; Hello大家好&#xff0c;我是Dream。在当下&#xff0c;科技的飞速发展已经深入影响着我们的日常生活&#xff0c;特别是随着物联网的兴起和5G网络的普及&#xff0c;云计算作为一个重要的技术概念也逐渐走进了我们的视野。云计算早已不再是一个陌生的名词&am…

Mysql配置autocommit实际使用(慎用)

以下内容都是基于MySQL5.7。所有操作建议在MySQL客户端执行。navicat可能会先意想不到的问题 在导入频繁执行update、insert的时候&#xff0c;可以考虑关闭MySQL的自动提交 首先查询当前的状态 1开启 0关闭 select autocommit;设置本次连接关闭自动提交(如果需要永久关闭请修…

MySQL的安装

第一步 先下载MySQL 的压缩包 官网链接: 点击跳转MySQL官网 或者直接下载我所上传的压缩包MySQL8.0.20X64 第二步 将下载的文件解压&#xff0c;我的解压位置为E:\Program Files目录&#xff0c;大家可以根据自己的需求解压到不同位置。如下图 第三步 进入到E:\Program Files…

导演、音乐家、艺术家眼中的Sora第一印象

自从2月16日Sora发布的那个夜晚以来&#xff0c;多少人都在翘首以盼&#xff0c;期待能真正的用上Sora。但是OpenAI自己也懂&#xff0c;基于模型对齐问题、安全问题、推理算力问题等等&#xff0c;这玩意短期内&#xff0c;基本不可能放出来给大众用。当然了&#xff0c;等以后…

【Linux】进程的基本概念(进程控制块,ps命令,top命令查看进程)

目录 01.进程的基本概念 程序与进程 进程的属性 02.进程控制块&#xff08;PCB&#xff09; task_struct的内容分类 组织进程 03.查看进程 ps命令 top指令 在计算机科学领域&#xff0c;进程是一项关键概念&#xff0c;它是程序执行的一个实例&#xff0c;是操作系统的…

如何保证缓存与数据库的双写一致性?

如何保证缓存与数据库的双写一致性&#xff1f; 概述同步策略更新缓存还是删除缓存&#xff1a;先操作数据库还是缓存&#xff1a;案例一、先删除缓存&#xff0c;在更新数据库案例二 先操作数据库&#xff0c;再删除缓存 延时双删策略&#xff08;不推荐&#xff09;使用分布式…