Vue自定义指令实现懒加载

Vue自定义指令注册(全局注册)

Vue.directive('自定义指令命名',{
   bind(){},
   inserted(){},
   update(){}, 
   componentUpdated(){},
   unbind()
})

第一个参数,为自定义指令的名称,不用带 v- 。第二个参数为一个对象,其中有5个钩子函数,类似于vue的生命周期钩子函数,它们也是被绑定元素各个周期会触发的钩子函数。

 每个执行时期如下:

bind():只调用一次,指令第一次绑定到HTML元素时调用。在这里可以进行一次性的初始化设置。
inserted():当指令绑定的元素插入到父节点中的时候触发。
update():当指令绑定的元素状态/样式、内容(这里指元素绑定的 vue 数据) 发生改变时触发。
componentUpdated():当 update() 执行完毕之后触发。
unbind():只调用一次,指令与元素解绑时调用。

 其中,每个钩子函数传入4个参数分别为:

el:指令所绑定的元素,可以用来直接操作 DOM。
binding:一个对象,包含以下 property:
    name:指令名,不包括 v- 前缀。
    value:指令的绑定值,例如:v-my-directive="1 + 1" 中,绑定值为 2。
    oldValue:指令绑定的前一个值,仅在 update 和 componentUpdated 钩子中可用。无论值是否改变都可用。
    expression:字符串形式的指令表达式。例如 v-my-directive="1 + 1" 中,表达式为 "1 + 1"。
    arg:传给指令的参数,可选。例如 v-my-directive:foo 中,参数为 "foo"。
    modifiers:一个包含修饰符的对象。例如:v-my-directive.foo.bar 中,
    修饰符对象为 { foo: true, bar: true }。
vnode:Vue 编译生成的虚拟节点。
oldVnode:上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。

 一般来说,最常用的就是bind()和inserted()

了解完自定义指令的属性和方法,就可以实现图片的懒加载

首先介绍一个对象 IntersectionObserver ,它有如下属性

定义一个观察器,entries为状态改变元素的数组

 callback函数的参数(entries)是⼀个数组,每个成员都是⼀个IntersectionObserverEntry

            time:可见性发⽣变化的时间,是⼀个⾼精度时间戳,单位为毫秒

            target:被观察的⽬标元素,是⼀个 DOM 节点对象

            rootBounds:根元素的矩形区域的信息,

            getBoundingClientRect() ⽅法的返回值,如果没有根元素(即直接相对于视⼝滚动),则返回null

            boundingClientRect :⽬标元素的矩形区域的信息

            intersectionRect :⽬标元素与视⼝(或根元素)的交叉区域的信息

            intersectionRatio:⽬标元素的可见⽐例,即

            intersectionRect占 boundingClientRect的⽐例,完全可见时为1,完全不可见时⼩于等于0

<script>
    const app = new Vue({
        el: "#app",
        data: {
            moren: "img/0.png",
            arrSrc: [
                "img/1.jpg",
                "img/2.jpg",
                "img/3.jpg",
                "img/4.jpg",
                "img/5.jpg",
                "img/6.jpg",
                "img/7.jpg",
                "img/8.jpg",
            ],
        },
    });
    Vue.directive("lazy", {
        inserted(el, binding) {
            let observer = new IntersectionObserver((entries) => {
                // 遍历
                for (let i of entries) {
                    // 如果改元素处于可视区
                    if (i.isIntersecting > 0) {
                        // 获取该元素
                        let img = i.target;
                        // 重新设置src值
                        img.src = binding.value;
                        //取消对该元素的观察
                        observer.unobserve(img);
                    }
                }
            });
            // 为 img 标签添加一个观察
            observer.observe(el);
        },
    });

</script>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值