当前位置:首页 > 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 实现文件树的方法 使用递归组件 递归组件是处理嵌套数据结构的理想方式。文件树通常包含文件夹和文件的嵌套结构,适合用递归组件实现。 <template> <ul>…

vue实现选人

vue实现选人

实现选人功能的基本思路 在Vue中实现选人功能通常涉及以下核心环节:数据绑定、用户交互处理、状态管理以及界面渲染。以下是具体实现方法: 数据准备与组件结构 创建包含人员信息的数组,通常从API获取或…

vue 实现登录验证

vue 实现登录验证

Vue 实现登录验证的方法 使用 Vue Router 进行路由守卫 在 Vue 项目中,可以通过 Vue Router 的路由守卫(Navigation Guards)实现登录验证。路由守卫可以在路…

vue实现匹配显示

vue实现匹配显示

Vue实现匹配显示的方法 使用v-if或v-show指令 通过条件渲染指令v-if或v-show,可以根据条件匹配显示不同的内容。v-if会完全销毁或重建DOM元素,而v-show仅切换CSS的dis…

vue实现接口连接

vue实现接口连接

Vue 实现接口连接的常用方法 Vue 中实现接口连接通常需要借助 HTTP 客户端库,以下是几种常见实现方式: 使用 Axios Axios 是流行的 HTTP 客户端库,支持 Promise A…

vue ssr实现思路

vue ssr实现思路

Vue SSR 实现思路 Vue SSR(Server-Side Rendering)的核心目标是在服务端生成完整的 HTML 页面,提升首屏加载速度和 SEO 友好性。以下是关键实现思路: 基础架…