Vue自定义图片懒加载指令v-lazyload详解
Vue是可以自定义指令的,最近学习过程中遇见了一个需要图片懒加载的功能,最后参考了别人的代码和思路自己重新写了一遍。以下将详细介绍如何实现自定义指令v-lazyload。 先看如何使用这个指令: imageSrc是要加载的图片的实际路径。 为了实现这个指令,我们首先单独建立一个文件,名字为lazyload.js.并填写基本的代码,如下: {
//初始化的选项,default是未加载图片时显示的默认图片
var init = {
default: 'https://gw.alicdn.com/tps/i1/TB147JCLFXXXXc1XVXXxGsw1VXX-112-168.png'
}
//addListener为Vue指令的具体实现功能函数,我们这里为所有使用v-lazyload的指令的元素添加监听
//ele 是dom元素,binding是绑定的具体值,
//例如:
inserted 和 updated为Vue指令的执行不同阶段提供的钩子函数,查看Vue的官网可以看到一共有5个阶段, 指令定义函数提供了几个 钩子函数(可选):bind:只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。inserted:被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。update:被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。componentUpdated:被绑定元素所在模板完成一次更新周期时调用。unbind: 只调用一次, 指令与元素解绑时调用。 这里我们只用inserted和updated就够了。 接下来我们具体实现addListener的实现。我们的具体思路如下: 1、先看看这个图片是否需要懒加载。有两种情况,一是图片还没到达可视区域,二是图片已经加载过了。 2、然后监听窗口的scroll事件,判断哪些图片可以进行懒加载了。 这里我们需要一个需要进行监听需要懒加载的图片列表和一个需要记录已经加载过得图片列表。另外为了方便数组的操作,我们加一个数组的remove方法。 继续我们的代码。 <div class="jb51code"> } }; }
} Vue.directive('lazyload',updated:addListener 接下来就几个空方法的实现了。 isAlredyLoad,判断是否已经加载过了这个图片 {
if(imageCatcheList.indexOf(imageSrc) > -1){
return true;
}else{
return false;
}
}
isCanShow 图片是否进入可视区域,如果已经进入则进行加载 {
var ele = item.ele;
var src = item.src;
//图片距离页面顶部的距离
var top = ele.getBoundingClientRect().top;
//页面可视区域的高度
var windowHeight = window.innerHight;
//top + 10 已经进入了可视区域10像素
if(top + 10 < window.innerHeight){
var image = new Image();
image.src = src;
image.onload = function(){
ele.src = src;
imageCatcheList.push(src);
listenList.remove(item);
}
return true;
}else{
return false;
}
};
onListenScroll监听滚动事件,并且检测是否进入可视区域。 {
window.addEventListener('scroll',function(){
var length = listenList.length;
for(let i = 0;i
最终我们的代码如下: <div class="jb51code"> var listenList = []; const isAlredyLoad = (imageSrc) => { const onListenScroll = () =>{ 使用时需要在主文件中引入这个文件,并且vue.use(); 并且在需要懒加载的图片上均按照如下使用v-lazyload指令即可
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程之家。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |