思路: 
DOM加载时,<img> 标签里,添加data-src路径 = src 路径, src路径 = 本地默认图片路径,
DOM加载完成后,监听页面可视区域,有data-src时,就将src路径替换成data-src路径,进行图片加载。
/**
* 页面
*/
import LazyLoad from '../libs/LazyLoad';
imglazyload(htmlStr) {
let imgList = [];
const src = [];
const dataSrc = [];
const imgSrc = [];
let newHtmlStr = htmlStr;
imgList = newHtmlStr.match(/<img [^>]* src=['"]([^'"]+)[^>]*>/gi, function (match, capture) {
});
/*
匹配图片(g表示匹配所有结果i表示区分大小写)
const imgReg = /<img.*>/gi;
匹配src属性
*/
const srcReg = / src=['"]?([^'"]*)['"]?/gi;
/* 匹配data-src属性
var dataSrcReg = / data-src=['"]?([^'"]*)['"]?/gi; */
if (imgList) {
for (let i = 0; i < imgList.length; i++) {
src[i] = imgList[i].match(srcReg);
/* dataSrc[i] = imgList[i].match(dataSrcReg); */
/* dataSrc赋值src,且不随src的改变而改变 */
dataSrc[i] = src[i].slice(0);
/* 替换src属性 */
dataSrc[i][0] = dataSrc[i][0].replace(/src/gi, 'data-src');
/* 组装 src data-src */
imgSrc[i] = '<img class="news_img_back"' + dataSrc[i][0];
/* 获取图片地址 */
newHtmlStr = newHtmlStr.replace(/<img [^>]* src=['"]?([^'"]*)['"]?/gi, imgSrc[i]);
}
      //newHtmlStr = newHtmlStr.replace(/(<img[^>]+)src=(['"]?([^'"]*)['"]?)/gi, "$1 data-src= $2"); //功能与绿色字体部分相同
        /* 进程的最后执行,即在return之后执行 */
setTimeout(LazyLoad, 0);
} return newHtmlStr;
} render(){
  <div dangerouslySetInnerHTML={{ __html: this.imglazyload(news.content)}} />
}
/* lazyload.js 
* expects a list of:
* `<img src="blank.gif" data-src="my_image.png" width="600" height="400" class="lazy">`
*/ const $q = function (q, res) {
if (document.querySelectorAll) {
res = document.querySelectorAll(q);
} else {
const d = document, a = d.styleSheets[0] || d.createStyleSheet();
a.addRule(q, 'f:b');
for (let l = d.all, b = 0, c = [], f = l.length; b < f; b++) {
l[b].currentStyle.f && c.push(l[b]);
}
a.removeRule(0);
res = c;
}
return res;
}, addEventListener = function (evt, fn) {
window.addEventListener ? window.addEventListener(evt, fn, false)
: (window.attachEvent) ? this.attachEvent('on' + evt, fn)
: window['on' + evt] = fn;
},
_has = function (obj, key) {
return Object.prototype.hasOwnProperty.call(obj, key);
}; /* src 与data-src 替换 */
function loadImage(el, fn) {
const img = new Image(),
/* getAttribute() 方法返回指定属性名的属性值 */
src = el.getAttribute('data-src');
/* img.onload: img元素加载完后执行 */
img.onload = function () {
if (!! el.parent) {
el.parent.replaceChild(img, el);
} else {
el.src = src;
}
fn ? fn() : null;
};
img.src = src;
} function elementInViewport(el) {
/* 获取元素各边距离页面各边的距离 */
const rect = el.getBoundingClientRect();
return (
rect.top >= 0
&& rect.left >= 0
&& rect.top <= (window.innerHeight || document.documentElement.clientHeight)
);
} export default function () {
const images = [],
query = $q('[data-src]'),
processScroll = function () {
for (let i = 0; i < images.length; i++) {
if (elementInViewport(images[i])) {
loadImage(images[i], function () {
images.splice(i, i);
});
}
}
};
/* Array.prototype.slice.call is not callable under our lovely IE8 */
for (let i = 0; i < query.length; i++) {
images.push(query[i]);
}
processScroll();
addEventListener('scroll', processScroll);
}
												

react lazyload的更多相关文章

  1. react 使用 lazyload 懒加载图片

    文档地址 index.html <script> (function(w, d) { var b = d.getElementsByTagName("body")[0] ...

  2. react初识

    如下是在研究中记录的笔记: 1,作用:局部的更新dom结构;虚拟dom保证性能2,和mvc不同,mvc是对于技术上的分离(分类),而react是组件上的分离,每个视图模块分离,复用,以视图模块为单位3 ...

  3. React 16 加载性能优化指南

    关于 React 应用加载的优化,其实网上类似的文章已经有太多太多了,随便一搜就是一堆,已经成为了一个老生常谈的问题. 但随着 React 16 和 Webpack 4.0 的发布,很多过去的优化手段 ...

  4. 使用react全家桶制作博客后台管理系统 网站PWA升级 移动端常见问题处理 循序渐进学.Net Core Web Api开发系列【4】:前端访问WebApi [Abp 源码分析]四、模块配置 [Abp 源码分析]三、依赖注入

    使用react全家桶制作博客后台管理系统   前面的话 笔者在做一个完整的博客上线项目,包括前台.后台.后端接口和服务器配置.本文将详细介绍使用react全家桶制作的博客后台管理系统 概述 该项目是基 ...

  5. 使用react+redux+react-redux+react-router+axios+scss技术栈从0到1开发一个applist应用

    先看效果图 github地址 github仓库 在线访问 初始化项目 #创建项目 create-react-app applist #如果没有安装create-react-app的话,先安装 npm ...

  6. react 首屏性能优化

    首屏优化点:1.加载包(bundle.js)文件的大小,越小,首屏渲染速度越快 (按需加载) 2.优先渲染用户直观看到的页面部分(懒加载) 技术点:react-loadable . react-laz ...

  7. React全家桶构建一款Web音乐App实战(六):排行榜及歌曲本地持久化

    上一节使用Redux管理歌曲相关数据,实现核心播放功能,播放功能是本项目最复杂的一个功能,涉及各个组件之间的数据交互,播放逻辑控制.这一节继续开发排行榜列表和排行榜详情,以及把播放歌曲和播放歌曲列表的 ...

  8. 看完你也想编写自己的 react 插件

    副标题----为什么我要写这个 react 插件 图片懒加载是项目中常用的功能,然而现有 react 懒加载组件库,用着都不是很爽了 ?.概括一下有如下几点: 没有只针对 image 懒加载组件.多数 ...

  9. 如何实现 React 模块动态导入

    如何实现 React 模块动态导入 React 模块动态导入 代码分割 webpack & code splitting https://reactjs.org/docs/code-split ...

随机推荐

  1. python中定义函数和参数的传递问题

    作者:達聞西链接:https://zhuanlan.zhihu.com/p/24162430来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 5.2.4 函数.生成器和类 ...

  2. js面向对象总结(一)

    在 js 中,对象由特性(attribute)构成,特性可以是原始值,也可以是引用值.如果特性存放的是函数,它将被看作对象的方法(method),否则该特性被看作对象的属性(property).在js ...

  3. mysql分区操作

    分区表使用myisam引擎. 分区规则: Range(范围)–这种模式允许将数据划分不同范围.例如可以将一个表通过年份划分成若干个分区. Hash(哈希)–这中模式允许通过对表的一个或多个列的Hash ...

  4. MySQL导出数据

    1.MySQL导出数据库 只导出数据库结构:选中数据库-->右键—>数据传输—>高级—>取消勾选记录选项.

  5. linux install matlab2014a

    https://pan.baidu.com/s/1qYJ9tNm#list/path=%2F下载镜像文件 2#开始安装,全程最好断网 sudo mkdir /media/matlab sudo mou ...

  6. ZeroMQ接口函数之 :zmq_disconnect - 断开一个socket的连接

    ZeroMQ 官方地址 :http://api.zeromq.org/4-0:zmq_disconnect zmq_disconnect(3) ØMQ Manual - ØMQ/3.2.5 Name ...

  7. ZeroMQ接口函数之 :zmq_plain - 明文认证

    ZeroMQ 官方地址 :http://api.zeromq.org/4-2:zmq_plain zmq_plain(7) ØMQ Manual - ØMQ/4.1.0 Name zmq_plain  ...

  8. H.264的优势和主要特点

    H.264,同时也是MPEG-4第十部分,是由ITU-T视频编码专家组(VCEG)和ISO/IEC动态图像专家组(MPEG)联合组成的联合视频组(JVT,Joint Video Team)提出的高度压 ...

  9. Git 常用命令行

    最近在公司的服务器上安装了Git Sever,开始从SVN转向到Git了,整理了一些在Git常用的命令. 取得Git仓库 初始化一个版本仓库 git initClone远程版本库 git clone ...

  10. Learn ZYNQ (9)

    创建zybo cluster的spark集群(计算层面): 1.每个节点都是同样的filesystem,mac地址冲突,故: vi ./etc/profile export PATH=/usr/loc ...