思路: 
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. 2012 Multi-University #9

    计算几何 A Farmer Greedy 题意:n个点选3个组成三角形,问m个点在三角形内的数字是奇数的这样的三角形个数. 分析:暴力O(N^3*M)竟然能过!我写的搓,加了优化才过掉.正解是先处理出 ...

  2. ZeroMQ接口函数之 :zmq_ctx_set - 设置环境上下文属性

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

  3. MySQL中INFORMATION_SCHEMA是什么?(1)

    在获取自增ID时,我用到了以下语句: select auto_increment from information_schema.tables where table_name = "表名& ...

  4. 07@Pattern_Note_命令模式

    前言 20160109: 今天开始看命令模式,主要从概念和实现来深入理解该模式 概念理解[部分来自摘录] 概念 通常来说,"行为请求者"与"行为实现者"是紧耦合 ...

  5. 保护眼睛(ubuntu 和 chrome)

    chrome 安插件https://chrome.google.com/webstore/detail/%E4%BF%9D%E6%8A%A4%E7%9C%BC%E7%9D%9B/fgadnbmmoln ...

  6. sun公司的jstl标签库

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...

  7. 【30集iCore3_ADP出厂源代码(ARM部分)讲解视频】30-1 前言

    视频简介: 该视频介绍收到iCore3应用开发平台后如何获取出厂代码,以 及如何下载出厂代码到应用开发平台中. 源视频包下载地址: http://pan.baidu.com/s/1nuUZW17   ...

  8. shujuk

    数据库管理的目标:在适当的时候以适当的形式向适当的人提供适当的数据. 2. 数据管理的内容:组织业务的管理(学生的信息) :技术的管理(数据库的建立等) 3. 数据库管理的发展阶段:人工,文件,数据库 ...

  9. 如何使用Google Map API开发Android地图应用

    两年前开发过的GoogleMap已经大变样,最近有项目要用到GoogleMap,重新来配置Android GoogleMap开发环境,还真是踩了不少坑. 一.下载Android SDK Manager ...

  10. eclipse如何配置tomcat运行web项目时省略项目名称

    三个关键点,如图所示