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

介绍一个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>

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

GitHub 加速计划 / vu / vue
207.54 K
33.66 K
下载
vuejs/vue: 是一个用于构建用户界面的 JavaScript 框架,具有简洁的语法和丰富的组件库,可以用于开发单页面应用程序和多页面应用程序。
最近提交(Master分支:2 个月前 )
73486cb5 * chore: fix link broken Signed-off-by: snoppy <michaleli@foxmail.com> * Update packages/template-compiler/README.md [skip ci] --------- Signed-off-by: snoppy <michaleli@foxmail.com> Co-authored-by: Eduardo San Martin Morote <posva@users.noreply.github.com> 4 个月前
e428d891 Updated Browser Compatibility reference. The previous currently returns HTTP 404. 5 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐