vue 实现图片懒加载
实现图片懒加载的方法
在Vue中实现图片懒加载可以通过多种方式,以下是几种常见的方法:
使用Intersection Observer API
Intersection Observer API是现代浏览器提供的原生API,用于检测元素是否进入视口。这种方法性能较好,适合现代浏览器环境。
// 在Vue组件中使用Intersection Observer
export default {
mounted() {
const images = this.$el.querySelectorAll('img[data-src]');
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
const img = entry.target;
img.src = img.dataset.src;
observer.unobserve(img);
}
});
});
images.forEach(img => observer.observe(img));
}
}
使用vue-lazyload插件
vue-lazyload是一个专门为Vue设计的懒加载插件,使用简单且功能丰富。

安装插件:
npm install vue-lazyload
在main.js中配置:

import VueLazyload from 'vue-lazyload'
Vue.use(VueLazyload, {
preLoad: 1.3,
error: 'error.png',
loading: 'loading.gif',
attempt: 1
})
在组件中使用:
<img v-lazy="imageUrl">
自定义指令实现
可以创建一个自定义指令来实现懒加载功能,这种方式灵活性较高。
// 全局指令
Vue.directive('lazy', {
inserted: (el, binding) => {
const observer = new IntersectionObserver(([entry]) => {
if (entry.isIntersecting) {
el.src = binding.value;
observer.unobserve(el);
}
});
observer.observe(el);
}
});
// 使用方式
<img v-lazy="imageUrl">
使用loading属性
HTML原生提供了loading="lazy"属性,这是最简单的实现方式,但浏览器兼容性有限。
<img src="image.jpg" loading="lazy" alt="example">
注意事项
- 对于不支持Intersection Observer的旧浏览器,需要准备polyfill
- 考虑为懒加载图片设置占位图,避免布局抖动
- 移动端可能需要调整threshold阈值,确保图片提前加载
- 大量图片懒加载时,注意内存管理和性能优化
以上方法可以根据项目需求和技术栈选择最适合的实现方案。现代项目中推荐使用Intersection Observer API或vue-lazyload插件,它们提供了良好的性能和开发体验。






