Vvu3-用useIntersectionObserver实现图片懒加载

 一、熟悉指令语法

在 main.js 中定义全局指令

// 定义全局指令
app.directive('img-lazy', {
  mounted(el, binding) {
    // el:指令绑定的那个元素 img
    // binding: binding.value 指令等于号后面绑定的表达式的值 图片 url
    console.log(el, binding.value);
  }
})

二、判断图片是否进入视口,这里用vueUse中的方法

useIntersectionObserver | VueUse

在 main.js 中修改代码

import { useIntersectionObserver } from '@vueuse/core'

// 定义全局指令
app.directive('img-lazy', {
  mounted(el, binding) {
    // el:指令绑定的那个元素 img
    // binding: binding.value 指令等于号后面绑定的表达式的值 图片 url
    console.log(el, binding.value);
    useIntersectionObserver(
      el,
      ([{ isIntersecting }],) => {
        console.log(isIntersecting);
      },
    )
  }
})

三、测试图片监控知否生效

// 定义全局指令
app.directive('img-lazy', {
  mounted(el, binding) {
    // el:指令绑定的那个元素 img
    // binding: binding.value 指令等于号后面绑定的表达式的值 图片 url
    console.log(el, binding.value);
    useIntersectionObserver(
      el,
      ([{ isIntersecting }],) => {
        // console.log(isIntersecting);
        if (isIntersecting) {
          el.src = binding.value
        }
      },
    )
  }
})

四、优化懒加载指令

4.1 位置优化

将懒加载指令放在 main.js 入口文件中十分不合理,因此可以将懒加载包装成一个插件

在src文件中新建文件夹directives->index.js

// 定义懒加载插件
import { useIntersectionObserver } from '@vueuse/core'


export const lazyPlugin = {
  install(app) {
    // 懒加载指令逻辑

    // 定义全局指令
    app.directive('img-lazy', {
      mounted(el, binding) {
        // el:指令绑定的那个元素 img
        // binding: binding.value 指令等于号后面绑定的表达式的值 图片 url
        console.log(el, binding.value);
        useIntersectionObserver(
          el,
          ([{ isIntersecting }],) => {
            // console.log(isIntersecting);
            if (isIntersecting) {
              el.src = binding.value
            }
          },
        )
      }
    })
  }
}

在 main.js 中引入懒加载指令插件并且注册

import { lazyPlugin } from '@/directives/index.js'

// 注册懒加载指令

app.use(lazyPlugin)

4.2 问题2:重复监听问题

useIntersectionObserver对于元素的监听是一直存在的,除非手动停止监听,存在内存浪费

解决思路:在监听的图片第一次完成加载之后就停止监听

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值