当前位置:首页 > VUE

自己实现vue懒加载

2026-02-21 04:51:13VUE

实现 Vue 懒加载的基本思路

懒加载(Lazy Loading)的核心思想是按需加载资源,通常在 Vue 中用于延迟加载组件或图片。以下是两种常见的实现方式:

组件懒加载

Vue 结合 Webpack 的动态导入(Dynamic Import)实现组件懒加载:

// 静态导入(非懒加载)
import StaticComponent from './StaticComponent.vue'

// 动态导入(懒加载)
const LazyComponent = () => import('./LazyComponent.vue')

export default {
  components: {
    StaticComponent,
    LazyComponent
  }
}

动态导入会返回一个 Promise,Webpack 会自动将动态导入的组件拆分为单独的 chunk,仅在需要时加载。

图片懒加载

实现图片懒加载需要监听元素是否进入视口:

// 自定义指令实现
Vue.directive('lazy', {
  inserted: (el, binding) => {
    const observer = new IntersectionObserver((entries) => {
      entries.forEach(entry => {
        if (entry.isIntersecting) {
          el.src = binding.value
          observer.unobserve(el)
        }
      })
    })
    observer.observe(el)
  }
})

// 使用方式
<img v-lazy="'path/to/image.jpg'" alt="Lazy Image">

优化懒加载体验

添加加载状态和错误处理:

Vue.directive('lazy', {
  inserted: (el, binding) => {
    el.src = 'placeholder.jpg' // 占位图
    const observer = new IntersectionObserver((entries) => {
      entries.forEach(entry => {
        if (entry.isIntersecting) {
          const img = new Image()
          img.src = binding.value
          img.onload = () => {
            el.src = binding.value
          }
          img.onerror = () => {
            el.src = 'error.jpg' // 错误处理
          }
          observer.unobserve(el)
        }
      })
    })
    observer.observe(el)
  }
})

浏览器兼容性处理

对于不支持 IntersectionObserver 的浏览器:

const lazyLoad = (el) => {
  const rect = el.getBoundingClientRect()
  return (
    rect.top <= (window.innerHeight || document.documentElement.clientHeight) &&
    rect.left <= (window.innerWidth || document.documentElement.clientWidth)
  )
}

Vue.directive('lazy', {
  inserted: function(el, binding) {
    function load() {
      if (lazyLoad(el)) {
        el.src = binding.value
        window.removeEventListener('scroll', load)
      }
    }
    window.addEventListener('scroll', load)
    load()
  }
})

性能优化建议

  1. 设置合适的 rootMargin 扩大触发范围:

    new IntersectionObserver(callback, {
    rootMargin: '200px'
    })
  2. 对大量图片使用节流:

    let ticking = false
    window.addEventListener('scroll', () => {
    if (!ticking) {
     window.requestAnimationFrame(() => {
       loadImages()
       ticking = false
     })
     ticking = true
    }
    })
  3. 预加载即将进入视口的资源:

    自己实现vue懒加载

    const observer = new IntersectionObserver((entries) => {
    entries.forEach(entry => {
     if (entry.isIntersecting || entry.boundingClientRect.top < 300) {
       // 加载逻辑
     }
    })
    }, {
    rootMargin: '300px'
    })

以上实现方式可以根据项目需求进行组合和调整,核心思想都是延迟资源的加载时机直到真正需要时。

标签: 加载vue
分享给朋友:

相关文章

vue设计与实现 书

vue设计与实现 书

vue设计与实现 书 《Vue.js设计与实现》是一本深入探讨Vue.js框架内部原理和设计思想的书籍,适合希望深入理解Vue.js的开发者。以下是关于这本书的详细信息: 书籍内容 《Vue.js设…

vue中登陆实现逻辑

vue中登陆实现逻辑

Vue 中登录实现逻辑 前端实现逻辑 表单验证 使用 Vue 的表单验证库(如 VeeValidate)或自定义验证规则,确保用户输入的账号和密码符合要求。例如,检查邮箱格式、密码长度等。 发送登录…

vue实现ajax

vue实现ajax

Vue 中实现 AJAX 的几种方法 在 Vue 中实现 AJAX 请求可以通过原生 JavaScript 的 XMLHttpRequest、第三方库如 axios 或 fetch API 来完成。以…

vue实现addclass

vue实现addclass

Vue 实现动态添加 class 的方法 在 Vue 中动态添加 class 可以通过多种方式实现,以下是常见的几种方法: 使用对象语法 通过绑定一个对象到 :class,可以动态切换 class…

vue实现滚屏

vue实现滚屏

实现滚屏的基本方法 在Vue中实现滚屏效果可以通过多种方式完成,常见的有原生JavaScript滚动方法、第三方库或CSS动画。以下是几种常见实现方式: 使用window.scrollTo或Elem…

vue实现ftp

vue实现ftp

Vue 中实现 FTP 功能 Vue 本身是一个前端框架,无法直接操作 FTP 协议(FTP 通常需要后端支持)。以下是两种常见实现方式: 前端与后端配合实现 FTP 前端通过 API 与后端通信,…