基于vue3.0和IntersectionObserver封装懒加载指令

目的: 当图片进入可视区域内去加载图片,且处理加载失败,封装成指令。

介绍一个webAPI:IntersectionObserver

// 创建观察对象实例
const observer = new IntersectionObserver(callback[, options])
// callback 被观察dom进入可视区离开可视区都会触发
// - 两个回调参数 entries , observer
// - entries 被观察的元素信息对象的数组 [{元素信息},{}],信息中isIntersecting判断进入或离开
// - observer 就是观察实例
// options 配置参数
// - 三个配置属性 root rootMargin threshold
// - root 基于的滚动容器,默认是document
// - rootMargin 容器有没有外边距
// - threshold 交叉的比例

// 实例提供两个方法
// observe(dom) 观察哪个dom
// unobserve(dom) 停止观察那个dom

基于vue3.0和IntersectionObserver封装懒加载指令

import defaultImg from '@/assets/images/200.png'

export default {
  install (app) {
    // 在app上进行扩展 app提供 component directive 函数
    // 如果要挂载原型 app.config.globalProperties 方式
    defineDirective(app)
  }
}

const defineDirective = (app) => {
  // 1.图片懒加载指令 v-lazy
  // 原理:先存储图片地址不能在src上 当图片进入可视区 将你存储图片地址设置给图片元素
  app.directive('lazy', {
    // vue2.0 监听使用指令的DOM是否创建好 钩子函数:inserted
    // vue3.0 的指令拥有的钩子函数和组件一样 钩子函数:mounted
    mounted (el, binding) {
      // 2.创建一个观察对象 来观察当前使用指令的元素
      const observe = new IntersectionObserver(([{ isIntersecting }]) => {
        if (isIntersecting) {
          // 停止观察
          observe.unobserve(el)
          // 4.处理图片加载失败
          el.onerror = () => {
            // 加载失败 设置默认图
            el.src = defaultImg
          }
          // 3.把指令的值设置给el的src属性 binding.value就是指令的值
          el.src = binding.value
        }
      }, {
        threshold: 0
      })
      // 开启观察
      observe.observe(el)
    }
  })
}

在main.js中注册

import { createApp } from 'vue'
import App from './App.vue'

createApp(App).use(directive).mount('#app')

使用指令:

将原本的 :src 变成我们刚才写的 v-lazy 指令

<div v-for="cate in list" :key="cate.id">
   <img v-lazy="cate.picture" alt="">
</div>

这样我们的图片懒加载指令就完成了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值