vue3自定义指令(图片懒加载)

一、作用:

创建类似与v-for、v-on的指令;本文以图片的懒加载为例

注册函数:

app.directive(key, directive);

二、vue3自定义指令钩子函数

created:在绑定元素的 attribute 或事件监听器被应用之前调用。在指令需要附加在普通的 v-on 事件监听器调用前的事件监听器中时,这很有用。

beforeMount:当指令第一次绑定到元素并且在挂载父组件之前调用。

mounted:在绑定元素的父组件被挂载后调用,大部分自定义指令都写在这里。

beforeUpdate:在更新包含组件的 VNode 之前调用。

updated:在包含组件的 VNode 及其子组件的 VNode 更新后调用。

beforeUnmount:在卸载绑定元素的父组件之前调用

unmounted:当指令与元素解除绑定且父组件已卸载时,只调用一次


引用自如下:                     
原文链接:https://blog.csdn.net/snowball_li/article/details/123549051

三、创建一个懒加载的ts文件如(lazy.ts):

import loading from '@/assets/images/loading.png';
import placeholder from '@/assets/images/placeholder.png';

export default {
    beforeMount(el: HTMLImageElement) {
        const img = el;
        const src = img.getAttribute('src');
        if (!src) {
            img.setAttribute('src', placeholder);
            return;
        }
        // 图片使用loading gif替换
        img.setAttribute('src', loading);
        // 新建Image对象
        const tempImg = new Image();
        tempImg.onload = function () {
            img.setAttribute('src',src);
        };
        tempImg.onerror = () => {
            img.setAttribute('src', placeholder);
        };
        const observer = new IntersectionObserver(function (changes) {
            // img元素进入可视区域
            changes.forEach((item) => {
                if (item.intersectionRatio !== 0) {
                    tempImg.src = <string>src;
                }
            });
        });
        observer.observe(el);
    },
};

四、程序入口文件加载该指令:

import type { App, Directive } from 'vue';
import lazy from './lazy';

const app = createApp(App);
app.directive("lazy ", lazy );

五、页面可使用该指令

<img v-lazy :src="pigUrl" />

这样,在img展示图片时,会先展示加载中动画,然后如果能请求到图片就展示图片,否在展示默认图片

六、其他说明

IntersectionObserver可参考js原始用途:IntersectionObserver(交叉观察器)-CSDN博客

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值