Vue实现懒加载的基本思路
懒加载是前端开发者的基本功之一。实现懒加载肯定是要直接操作DOM的,这个没得跑,但我们可以想办法让流程尽可能优雅些。
基本结构
父组件是列表容器,子组件是列表中的项,如卡片、帖子等,承载图片的DOM对象由子组件直接管理。
<div class="list-container">
<item v-for="post in postlist" :key="post.id" :images="post.images" :text="post.text"></item>
</div>
实现思路
准备工作
首先,我们需要一个父子组件都能访问和操作的数组imageList,可以考虑放在一个专门的模块里,父子组件各自import。
然后,我们定义一个名叫LazyImage的类,用于把图片的url和DOM绑定在一个对象里,方便操作:
class LazyImage {
constructor(src) {
this.src = src; // 图片url或base64
this.dom = null; // 承载图片的DOM元素
this.status = 'pending'; // 图片当前状态
}
}
其中status表示图片资源当前的状态,有pending(未加载)、loading(加载中)、loaded(加载完成或失败)三个取值。
最后,我们需要一张占位图,用于图片加载完成前占位展示。
步骤1
当网页从服务器拉取到10条帖子时,每个帖子子组件各自把自己负责的图片和DOM对应起来,放进同一个LazyImage对象,然后push进imageList。
这一步有两个地方需要注意:
1. 承载图片的DOM对象,其src/background-image值应设为占位图,真正的图片url先保存在data-src属性里,用于图片url和DOM元素“相认”;
2. 在mounted钩子函数里直接访问this.$refs可能为空,因为此时真正的DOM渲染还没完成,可以放在this.$nextTick的回调函数里访问。
步骤2
在父组件里监听window的scroll事件,每次触发时,先把状态不为pending的图片给filter出去,然后检查一下imageList里的每个图片的DOM是否在当前可视范围内里,若是,则将其src/background-image替换为真正的图片url,不不不,直接替换链接不够优雅,若是原图很大,网速又不太快,图片就会像挤牙膏一样,一点一点地显露出来,令人捉急。我们可以先new一个Image对象,预加载原图,待图片加载完成后,再把真正的url替换上去,做到无缝切换。
注意点:
1. scroll事件触发频繁,为减轻对性能的影响,可以加上节流措施,比如设定滚动距离大于一定阈值时才触发对imageList的遍历检查;
2. 在首屏加载完成后,需要手动触发一次检查,否则在不滚动的情况下首屏图片不加载。
这样就轻松实现了图片的懒加载。
Vue实现懒加载的基本思路的更多相关文章
- Vue图片懒加载插件
图片懒加载是一个很常用的功能,特别是一些电商平台,这对性能优化至关重要.今天就用vue来实现一个图片懒加载的插件. 这篇博客采用"三步走"战略--Vue.use().Vue.dir ...
- 前端性能优化成神之路--vue组件懒加载(Vue Lazy Component )
---恢复内容开始--- 使用组件懒加载的原因 我们先来看看这样的一个页面,页面由大量模块组成,所有模块是同时进行加载,模块中图片内容较多,每个模块的依赖资源较多(包括js文件.接口文件.css文件等 ...
- vue组件懒加载
vue2组件懒加载浅析 一. 什么是懒加载 懒加载也叫延迟加载,即在需要的时候进行加载,随用随载. 二.为什么需要懒加载 在单页应用中,如果没有应用懒加载,运用webpack打包后的文件将会异常的大, ...
- vue 路由懒加载 使用,优化对比
vue这种单页面应用,如果没有应用懒加载,运用webpack打包后的文件将会异常的大,造成进入首页时,需要加载的内容过多,时间过长,会出啊先长时间的白屏,即使做了loading也是不利于用户体验,而运 ...
- vue实现懒加载的几种方法
vue实现惰性加载是基于: 1.ES6的异步机制 components: { comp: (resolve, reject) => {} } 2. webpack的代码分割功能 require. ...
- vue 图片懒加载 vue-lazyload
图片懒加载 在实际的项目开发中,我们通常会遇见这样的场景:一个页面有很多图片,而首屏出现的图片大概就一两张,那么我们还要一次性把所有图片都加载出来吗?显然这是愚蠢的,不仅影响页面渲染速度,还浪费带宽. ...
- VUE图片懒加载-vue lazyload插件的简单使用
序:vue项目时候,我们要对图片进行懒加载处理,这个开发项目中就不需要自己去写了,因为比较方便使用vue lazyload进行处理,高效率开发 一. vue lazyload插件: 插件地址:http ...
- Vue图片懒加载
图片懒加载的原理 先将img标签中的src链接设为同一张图片(空白图片),将其真正的图片地址存储再img标签的自定义属性中(比如data-src).当js监听到该图片元素进入可视窗口时,即将自定义属性 ...
- Vue图片懒加载之lazyload插件使用
当内容没有加载完的时候,用户体验不是很好,这时候,可以使用lazyload这个插件,提升用户体验,使用方法特别简单易用 一. vue lazyload插件: 插件地址:https://github.c ...
随机推荐
- WMI参数介绍
Win32_DiskDrive 硬盘 参数说明 vailability --设备的状态.BytesPerSector --在每个扇区的物理磁盘驱动器的字节数.Capabilities --媒体访 ...
- struts2各个功能详解(1)----参数自动封装和类型自动转换
struts2里面的各个功能,现在确实都不清楚,完全属于新学! 通过前面的例子,有时就会疑问,这些jsp中的数据信息是怎么传送给action的?例如: <form action = " ...
- MVC Request生命周期(综合总结)
当用户在浏览器输入一个URL地址后,浏览器会发送一个请求到服务器.这时候在服务器上第一个负责处理请求的是IIS.然后IIS再根据请求的URL扩展名将请求分发给不同的处理程序处理. 流程如下: 当请求一 ...
- java去除数组重复元素的方法
转载自:https://blog.csdn.net/Solar24/article/details/78672500 import java.util.ArrayList; import java.u ...
- kubenetes安装记录和要点
https://blog.csdn.net/jinglexy/article/details/79813546 在官网web上进行kubenetes测试:kubectl run kubernetes- ...
- 3200 [HNOI2009]有趣的数列
题面 dalao们都说这是一题简单的卡特兰数,画一画就出来了 emmmmm…… 讲讲怎么分解质因数来算组合数 先打个表 void prim(){ ex[]=ex[]=; ;i<=*n;i++){ ...
- Trachtenberg(特拉亨伯格)速算系统
二战期间,俄国的数学家Jakow Trachtenberg(1888-1953)被关进纳粹集中营,在狱中,他开发出了一套心算算法,这套算法后来被命名为Trachtenberg(特拉亨伯格)速算系统. ...
- maven 在clean package时,出现:找不到符号 [ERROR] 符号: 方法 sqlDdlFilter(java.lang.String) 解决办法
另一个项目中增加了,sqlDdlFilter 在调用的项目中clean package时,出现 找不到符号[ERROR] 符号: 方法 sqlDdlFilter(java.lang.String) 原 ...
- 【MySQL】初识数据库及简单操作
一.数据库概述 1.1 什么是数据(Data) 描述事物的符号记录称为数据,描述事物的符号既可以是数字,也可以是文字.图片,图像.声音.语言等,数据由多种表现形式,它们都可以经过数字化后存入计算机. ...
- 安装composer Failed to decode zlib stream 问题解决方法
https://getcomposer.org/download/ 页面下载最新版本 composer.phar 放到php.exe 页面下.创建一个.bat文件,存入下面内容 @ECHO OFF p ...