vue3 --- 图片懒加载指令

414 阅读1分钟

一、新建目录 directives/lazy.js

// 1. 获取指定元素对象
// 2. mounted 当指定元素渲染完成后do work
// 3. 监听元素是否进入可视区
// 4. 如果元素进入可视区 为图片设置 src 属性 停止监听
// 5. 如果图片加载失败 显示默认图片

// 导入默认图片
import defaultImg from '@/assets/images/200.png'

const lazy = {
    /**
     * 要在 Mounted 时期
     * @param el 指定元素对象
     * @param binding 指令的值
     */
    mounted(el, binding) {
        // 1.创建元素监听对象
        const observer = new IntersectionObserver(([{ isIntersecting }]) => {
            // console.log(el, isIntersecting); //@log
            // 1.1判断是否进入可视区
            if (isIntersecting) {
                console.log(isIntersecting,'开启懒加载');
                // 1.2停止监听对象
                observer.unobserve(el);
                // 1.3懒加载图片
                el.src = binding.value;
                // 1.4当图片加载错误时(显示默认图片)
                el.onerror = () => {
                    el.src = defaultImg;
                };
            }
        });
        // 2.开启监听对象
        observer.observe(el);
    },
};

export default function directiveLazy(app) {
    app.directive("lazy", lazy);
}

二、main.js中引入

import library from '@/directives/lazy'

const app = createApp(App)
app.use(library)

三、组件中使用

<img v-lazy="good.picture" src="" :alt="good.name" />