自研组件-createIntersectionObserver实现图片懒加载组件

news2024/11/27 20:29:27

项目:taro3+vue3

描述:图片懒加载通过滚动距离的计算进行加载,这里记录下用createIntersectionObserver来实现
createIntersectionObserver介绍任意门

原理比较简单,通过监听图片,出现在显示区域内就渲染图片,透明度0,图片加载完成后透明度为1,这样就有个过度效果,加载失败显示一个失败的,也可以再加个图片loading的效果,这里直接在容器上设置的背景色代替了

<view
   class="base-lazy-image"
   :id="`base-lazy-image-${index}`">
   <image
     v-if="isShowImg"
     class="img"
     :class="{'active': !isOpacity}"
     :src="url"
     @load="onLoad"
     @error="onError"></image>
   <view
     v-if="isShowError"
     class="error">error</view>
 </view>
.base-lazy-image {
  position: relative;
  width: 200px;
  height: 200px;
  background: red;
  .img {
    width: 100%;
    height: 100%;
    opacity: 0;
    transition: opacity .5s;
    &.active {
      opacity: 1;
    }
  }
  .error {
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    z-index: 10;
    display: flex;
    align-items: center;
    justify-content: center;
    width: 100%;
    height: 100%;
    background-color: #f7f8fa;
    color: #969799;
  }
}

isShowImg = ref(false)

isOpacity = ref(true)

isShowError = ref(false)

observer = ref(null)

// 参数
props: {
  url: {
    type: String,
    default: ''
  },
  index: {
    type: Number,
    default: 0
  }
}

clear() {
  if (this.observer.value) {
    this.observer.value.disconnect()
  }
  this.observer.value = null
}

addObserver() {
  let a = getCurrentInstance()
  if (this.observer.value || this.isShowImg.value) {
    return
  }
  const observer = Taro.createIntersectionObserver(a.page)
  observer.relativeToViewport({ bottom: -10 })
    .observe('#base-lazy-image-'+this.props.index, (res) => {
      if (res.intersectionRatio > 0) {
          this.isShowImg.value = true
          this.clear()
        }
    })
  this.observer.value = observer
}

watch(() => props.url, newVal => {
  if (newVal) {
    this.addObserver()
  }
})

页面中使用:

<block v-for="(item, index) in fieldList">
 <view
   :id="`merchant-item-${index}`"
   class="merchant-item f-l-c">
   <base-lazy-image
     :index="index"
     :url="item.url"/>
   <view class="con">
     <view class="name">
       名称-{{ index }}
     </view>
   </view>
 </view>
</block>
async getList() {
    // 获取列表
    const list = await xxx.xxxx()
    this.fieldList.value = list
    setTimeout(() => {
      for(let i = 0; i < this.fieldList.value.length; i++) {
        this.fieldList.value[i].url = this.fieldList.value[i].homeImage
      }
    }, 1000)
  }

注意点:
1、获取列表后要加个延时,要不然监听不到
2、组件里面是通过watch url去添加监听器,这个url必须有个赋值的过程,如果接口里面本来就是有url字段的,组件里面并不会去添加监听器
3、组件内监听的是id, 用index区分,监听到了结果后要断开监听,之前有试过监听 ‘.base-lazy-image’, 会全部展示出来
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Qt Creator常用快捷键及技巧

1.[Qt Creator常用快捷键及技巧提升编码效率] (https://blog.csdn.net/luoyayun361/article/details/105431913) 介绍了一些小技巧比如: 自动补全函数快捷注释函数前输入/** 回车自动补全注释alt 整列进行编写或者 左右移动,非常有用某一行的复制 ctrlaltup (或者down)向上向…

远程CentOs安装了MySQL,本地的Nvaicat/SqlYog无法正常连接?

#1、创建新用户 mysql> CREATE USER ‘username’‘%’ IDENTIFIED BY ‘userpassword’; #给普通用户远程连接的权限&#xff1a; #2、授权 myuser 用户对指定库的所有表&#xff0c;所有权限并设置远程访问 mysql> GRANT ALL ON 指定库.* TO ‘username’‘%’; #3、更…

查看域名的ip地址

1."winr" -- ping www.baidu.com 2."nslookup www.baidu.com"

点云数据标注方法研究

1.点云可视化工具 1.1 cloudcompare下载安装 sudo snap install cloudcompare 启动方法: #open pointcloud viewer cloudcompare.ccViewer #open the main software cloudcompare.CloudCompare 使用上述第一条命令&#xff0c;读取的点云某一帧数据&#xff0c;我的点云格…

作为帮助文档使用,语雀和Baklib哪个更适合?

语雀和Baklib都是常见的在线文档协作工具&#xff0c;它们都提供了方便的文档编辑、协作和分享功能。然而&#xff0c;它们在一些方面存在差异&#xff0c;这取决于你的具体需求和使用场景。 下面将对语雀和Baklib进行综合比较: 1. 功能和编辑体验 语雀和Baklib都具有强大的…

Golang学习之结构体和内存对齐、map设计思路

Golang学习之结构体和内存对齐、map设计思路 结构体和内存对齐内存对齐如何确定一个结构体的对其边界 map设计思路哈希表与扩容bmap的结构练习map扩容规则 结构体和内存对齐 cpu要想从内存读取数据&#xff0c;需要通过地址总线&#xff0c;把地址传输给内存&#xff0c;内存准…

【ONE·Linux || 地址空间与进程控制(一)】

总言 进程地址空间和进程控制相关介绍。 文章目录 总言1、进程地址空间1.1、程序地址空间初识1.1.1、介绍程序地址空间划分及地址空间初步验证1.1.2、地址空间再次综述演示1.1.3、两个补充问题&#xff1a; 1.2、地址空间是什么1.2.1、阶段认识一&#xff1a;故事引入1.2.2、阶…

redis浅析

一 什么是NoSQL&#xff1f; Nosql not only sql&#xff08;不仅仅是SQL&#xff09; 关系型数据库&#xff1a;列行&#xff0c;同一个表下数据的结构是一样的。 非关系型数据库&#xff1a;数据存储没有固定的格式&#xff0c;并且可以进行横向扩展。 NoSQL泛指非关系…

论文笔记:AugGPT: Leveraging ChatGPT for Text Data Augmentation

AugGPT&#xff1a;利用 ChatGPT 进行文本数据增强 摘要1 介绍2 相关工作2.1 数据增强2.2 小样本学习2.3 超大型语言模型2.4 ChatGPT&#xff1a;现在与未来 3 数据集3.1 亚马逊数据集3.2 症状数据集3.3 PubMed20k数据集 4 方法4.2 使用 ChatGPT 进行数据增强4.3 小样本文本分类…

Vue3通透教程【十五】补充TS开发环境搭建问题

文章目录 &#x1f31f; 写在前面&#x1f31f; Node中搭建TS开发环境&#x1f31f; 验证环境&#x1f31f; 写在最后 &#x1f31f; 写在前面 专栏介绍&#xff1a; 凉哥作为 Vue 的忠实 粉丝输出过大量的 Vue 文章&#xff0c;应粉丝要求开始更新 Vue3 的相关技术文章&#…

【运维】 第02讲(上):企业 Nginx 高性能优化配置实战总结

本课时讲解关于 Nginx 配置优化的内容&#xff0c;相信对于 Nginx 你一定并不陌生&#xff0c;它是一款轻量级的开源 Web 服务及代理程序。在 Nginx 出现之前市场上主流两款 Web 服务&#xff0c;一款是 Windows 系统上的 IIS&#xff0c;另外一款是 Linux 系统上的 Apache。而…

c++11 标准模板(STL)(std::basic_istream)(七)

定义于头文件 <istream>template< class CharT, class Traits std::char_traits<CharT> > class basic_istream : virtual public std::basic_ios<CharT, Traits> 类模板 basic_istream 提供字符流上的高层输入支持。受支持操作包含带格式的…

​“你的期望薪资是多少?” Hr现身说法,以退为进多杀2k

面试是初见1小时就要相互了解优缺点的过程&#xff0c;在你问我答的交锋中如何不露声色、不卑不亢的展现自己&#xff0c;通过以下几个常见问题的拆解&#xff0c;你会得到答案的~ 1.你的期望薪资是多少&#xff1f; 菜鸟的回答:假设上家公司是10K&#xff0c;一般人会说我想…

命令行系列:windows cmd官方文档

官方文档 和java开发、Android开发一样。cmd也有官方文档&#xff1a; https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/windows-commands 如下图&#xff0c;我们可以看到经典的cd,clean命令。 cd命令的全程是什么&#xff1f; cd命令…

基于51单片机的红外测温系统的设计与实现

功能框图 功能描述 本设计以STC89C52单片机为核心控制器&#xff0c;加上其他的模块一起组成非接触人体红外测温的整个系统&#xff0c;其中包含中控部分、输入部分和输出部分。中控部分采用了STC89C52单片机&#xff0c;其主要作用是获取输入部分数据&#xff0c;经过内部处理…

基于SpringBoot+vue的校园闲置物品交易网站设计与实现

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

【测试开发】软件测试的常用概念

目录 一. 软件测试的生命周期 1. 需求分析 2. 测试计划 3. 测试设计&#xff0c;测试开发 4. 测试执行 5. 测试评估 ​编辑 二. 软件的生命周期 1. 需求分析 2. 计划阶段 3. 设计阶段 4. 编码阶段 5. 测试阶段 6. 运行维护 三. 如何描述一个BUG 1. 发现问题…

Mac 谷歌浏览器选中查看悬浮出现的元素样式

Mac 谷歌浏览选中查看悬浮出现的元素样式 1. Mac 暂停脚本执行快捷键 command \或F8 2.以斗鱼主站下载悬浮面板为例 3. 操作步骤 &#xff08;1&#xff09;打开控制台&#xff0c;选中源代码 &#xff08;2&#xff09;鼠标选中下载&#xff0c;让面板悬浮出来 &#xf…

网络安全面试题

以下为网络安全各个方向涉及的面试题&#xff0c;星数越多代表问题出现的几率越大&#xff0c;祝各位都能找到满意的工作。 注&#xff1a;本套面试题&#xff0c;已整理成pdf文档&#xff0c;但内容还在持续更新中&#xff0c;因为无论如何都不可能覆盖所有的面试问题&#xf…

Linux命令----modprobe命令详解

【原文链接】Linux命令----modprobe命令详解 一、modprobe命令的作用 加载内核模块&#xff1a; 使用modprobe命令可以加载指定的内核模块到运行中的内核中。加载内核模块可以在运行时添加新的功能、驱动程序或修改内核行为。 解决模块依赖关系&#xff1a; modprobe命令可以…