【Vue】图片懒加载的实现

封装全局指令img-lazy

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)
        const { stop } = useIntersectionObserver(
          el,
          ([{ isIntersecting }]) => {
            console.log(isIntersecting)
            if (isIntersecting) {
              // 进入视口区域
              el.src = binding.value
              stop()
            }
          },
        )
      }
    })
  }
}

注册全局指令

js 复制代码
// 全局指令注册
import {lazyPlugin} from "@/directives";
app.use(lazyPlugin)

重构HomeHot.vue,从而实现懒加载效果,提高页面加载性能

html 复制代码
  <ul class="goods-list">
    <li v-for="item in hotList" :key="item.id">
      <RouterLink to="/">
        <img v-img-lazy="item.picture" alt="">
        <p class="name">{{ item.title }}</p>
        <p class="desc">{{ item.alt }}</p>
      </RouterLink>
    </li>
  </ul>

有一点需要说明:IntersectionObserver是异步库,这样即使目标元素一开始就在视口中,回调函数的执行也会在解构赋值之后,这样能够确保stop方法在回调函数中调用时已经被正确解构。

相关推荐
FFF-X5 分钟前
Vue3 路由缓存实战:从基础到进阶的完整指南
vue.js·spring boot·缓存
PineappleCoder7 分钟前
为什么说发布 - 订阅是代码的 “万能胶水”?解耦逻辑全解析
前端·javascript·算法
我叫黑大帅11 分钟前
微信小程序分包:告别加载慢,像拆快递一样简单!
前端·微信小程序
今禾15 分钟前
深入解析HTTP协议:从OSI模型到HTTP/3.0的演进与实战优化
前端·http·面试
sure28216 分钟前
react native 编写一个歌词组件
前端·react native
言兴17 分钟前
面试题深度解析:localStorage、sessionStorage 与 Cookie —— 前端存储的三大基石
前端·javascript·面试
言兴18 分钟前
HTTP 各版本演进史:从文本传输到极致性能 —— 深度解析协议进化与工程实践
前端·javascript·面试
跟橙姐学代码18 分钟前
学Python像学做人:从基础语法到人生哲理的成长之路
前端·python
临期程序员19 分钟前
TypeError: crypto.getRandomValues is not a function
前端·vue.js
鹏多多.22 分钟前
flutter-使用device_info_plus获取手机设备信息完整指南
android·前端·flutter·ios·数据分析·前端框架