千家信息网

vue-lazyload如何用

发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,这篇文章主要介绍了vue-lazyload如何用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇vue-lazyload如何用文章都会有所收获,下面我们一起来看看吧。v-l
千家信息网最后更新 2025年02月01日vue-lazyload如何用

这篇文章主要介绍了vue-lazyload如何用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇vue-lazyload如何用文章都会有所收获,下面我们一起来看看吧。

v-lazy

这个是Vue-Lazyload最常用的一个东西,用法也非常的简单:

我们现在来看看它的内部是如何实现的,首先我们进入它github上的源码可以发现它的定义:

Vue.directive('lazy', {  bind: lazy.add.bind(lazy),  update: lazy.update.bind(lazy),  componentUpdated: lazy.lazyLoadHandler.bind(lazy),  unbind: lazy.remove.bind(lazy)})Vue.directive('lazy-container', {  bind: lazyContainer.bind.bind(lazyContainer),  update: lazyContainer.update.bind(lazyContainer),  unbind: lazyContainer.unbind.bind(lazyContainer)})

我们可以发现它是利用vue的自定义指令实现的,vue的自定义指令可以自定义v-***之类的指令,例如你定义了Vue.directive('demo',..)那么你就可以使用v-demo这样的指令,当你使用了之后就会有对应事件供你回调,例如bind,insert,unbind等,具体可以看看下面的demo:

=> vue自定义指令(二维码)

进入demo后我们可以看到一进去就出发了bind和insert事件,然后你在输入框输入内容就会触发update和updateComponent事件,当你点击隐藏就会触发unbind事件,当你点击显示则又会触发bind和insert事件。(具体含义可以去查阅官方文档)

vue的自定义指令还可以带参数,例如vue-lazy:background-image.container='src'这样的结构,我们可以通过事件里面的binding参数获取到,例如上面的background-image可以通过binding.arg获取,.container可以通过binding.modifiers获取。

好了,讲了这么多,v-lazy的实现思路应该比较清楚了,就是内部实现了一个lazy的类,通过vue自定义指令将对象和参数传进去,然后通过检测事件(scroll等)检测位置,如果一旦这个对象出现在屏幕里就加载图片。下面看看已经实现好的demo:(包含img的v-lazy和div的v-lazy:background-image两种情况)

=> v-lazy demo(二维码)

注意:这里的v-lazy='src'中的src一定要使用data里面的变量,不能写真实的图片路径,这样会报错导致没有效果,因为vue的自定义指令必须对应data中的变量或者是数字,你写一个图片路径识别不了,我之前就是被坑了。(这里的图片fadeIn效果是在load事件之后添加了一个fadeIn的class)。

v-lazy-container

这个总体上和v-lazy差不多,也是通过自定义指令去定义的,不过v-lazy-container扫描的是内部的子元素,v-lazy-container一般使用如下:

v-lazy-container和v-lazy不同的是,v-lazy-container是通过设置指定的子元素的data-src,data-loading,data-error去设置图片的路径的,我们看内部实现就可以看到:

const imgs = this.getImgs()imgs.forEach(el => {   this.lazy.add(el, assign({}, this.binding, {     value: {       src: 'dataset' in el ? el.dataset.src : el.getAttribute('data-src'),       error: 'dataset' in el ? el.dataset.error : el.getAttribute('data-error'),       loading: 'dataset' in el ? el.dataset.loading : el.getAttribute('data-loading')     }   }), this.vnode) })

下面是写好的v-lazy-container demo:

=> v-lazy-container demo(二维码)

注:v-lazy-container内部指定元素设置的data-src是图片的真实路径,不能是data变量,这个和v-lazy完全相反。

lazy-component

这个和上面的不太一样,这个严格来说不单单能够做图片懒加载,还可以做组件的懒加载,一般结构如下:

   

实现方面,先用Vue.component('lazy-component',...)注册了一个全局的组件,然后通过检测位置,如果在视图范围之内就吐出它内部的内容,这个设计还是比较巧妙:

render (h) {   if (this.show === false) {     return h(this.tag)   }   return h(this.tag, null, this.$slots.default) },

我们一般用component都是指定一个template,它这里是利用render来自己生成内容,它这里通过一个变量show控制是否绘制内部的内容,开始的时候show为false,那么这里就绘制一个div(tag为div),等检测(检测div)出现屏幕了,show就为true,就会绘制它内部的真实内容了(this.$slots.default就是自定义控件下面的内容)。

lazy-component作为一个组件,给外部提供了一个回调事件(show),表示已经开始load了,所以我们可以在外层监听这个事件:

load () {   this.show = true   this.state.loaded = true   this.$emit('show', this) }

我们来看一个做好的demo,这个demo还是以实现图片懒加载为主。

=> lazy-component demo(二维码)

注:lazy-component本身不能实现图片懒加载,它只是实现组件懒加载,上面demo真正实现懒加载是因为用了v-lazy。lazy-component有一个问题,就是它的上方必须要有东西,否则可能没有效果,因为它在检测的时候有一个判断:bottom>0,所以如果你在第一个元素使用lazy-component可能没有效果。

关于"vue-lazyload如何用"这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对"vue-lazyload如何用"知识都有一定的了解,大家如果还想学习更多知识,欢迎关注行业资讯频道。

事件 图片 指令 内容 检测 元素 变量 就是 效果 组件 路径 面的 二维 二维码 参数 可以通过 知识 东西 位置 对象 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 无锡软件开发培训 数据库查询一个字段多个条件 兰州软件开发商 软件开发人员入职职业规划 洛阳360点搜网络技术 工行软件开发中心有几个研发部 数据库系统的安全管理软件 青海电力时钟监控网关服务器 芜湖县公共信息网络安全监察大队 药品广告数据库是浙江15秒 教育经费数据库连接不上 退役军人报考网络安全工程师 加强网络安全工作的主要任务 软件开发薪资调整理由 今年网络安全主题是什么 宁波常用网络技术信息推荐 惠普服务器系统管理 密码 sql删除几个表数据库 txt文本文档可以当数据库吗 服务器转发三次握手包 服务器错误405 电商平台数据库设计 广州系统软件开发靠谱吗 软件开发工作室的优势 西安易龙软件开发 酉阳管理软件开发 盐城师范学院的服务器地址 金融软件开发公司招骋 线上网络安全就业培训班怎么样 饥荒科雷服务器在哪
0