Concis组件库封装——LazyLoad懒加载
懒加载组件,支持任意元素进行延迟加载,可以在SPA单页应用首页渲染时减少非可视区的DOM渲染,加快首屏渲染效率,大致用法:
<LazyLoad><div><span>需要被懒加载的一些元素</span>.......</div>
</LazyLoad>
这一期的文档比较简单,主要就是支持懒加载包裹元素,没有很多的API,如下:
组件源码:
import React, { FC, memo, useEffect, useState, createRef } from 'react';interface LazyLoadProps {children?: any;/*** @description 延迟加载* @default 0ms*/delay?: number;
}const LazyLoad: FC<LazyLoadProps> = (props) => {const { children, delay } = props;const [showEl, setShowEl] = useState(false);const lazyRef = createRef();let io: IntersectionObserver; //观察者useEffect(() => {io = new IntersectionObserver((entries) => elementObverse(entries));io.observe(lazyRef.current as Element);}, []);const elementObverse = (entries: Array<IntersectionObserverEntry>) => {//监听函数entries.forEach((entry: IntersectionObserverEntry) => {if (entry.isIntersecting) {if (delay) {setTimeout(() => {setShowEl(true);}, delay);} else {setShowEl(true);}}});};return (<div className="lazyLoad" ref={lazyRef as any}>{showEl && children}</div>);
};export default memo(LazyLoad);
主要使用了IntersectionObserver这个类来监听懒加载的元素是否在可视区,来决定加载实现的。
import {LazyLoad} from 'react-view-ui';
然后顺便一起记录一下IntersectionObserver这个API的使用吧。
Intersection Observer 的概念和用法
Intersection Observer API提供了一种异步检测目标元素与祖先元素或 viewport 相交情况变化的方法,可以自动“观察”元素是否可见,可见的本质是目标元素与视口产生一个交叉区域,所以这个 API 叫做“交叉观察器”
Intersection Observer API 允许你配置一个回调函数,每当目标(target)元素与设备视窗或者其他指定元素发生交集的时候执行。设备视窗或者其他元素我们称它为根元素或根(root)。通常,您需要关注文档最接近的可滚动祖先元素的交集更改,如果元素不是可滚动元素的后代,则默认为设备视窗。如果要观察相对于根(root)元素的交集,请指定根(root)元素为null
创建 IntersectionObserver 对象
var intersectionObserver = new IntersectionObserver(callback, option);
当一个 IntersectionObserver 对象被创建时,其被配置为监听根中一段给定比例的可见区域。一旦 IntersectionObserver 被创建,则无法更改其配置,所以一个给定的观察者对象只能用来监听可见区域的特定变化值;然而,你可以在同一个观察者对象中配置监听多个目标元素。
callback 回调函数
当目标元素的可见性变化时,就会调用观察器的 callback 回调函数,回调函数的参数是一个数组,每个成员都是一个 IntersectionObserverEntry 对象
IntersectionObserverEntry 对象属性:
- time:可见性发生变化的时间,是一个高精度时间戳,单位为毫秒
- target:被观察的目标元素,是一个 DOM 节点对象
- rootBounds:根元素的矩形区域的信息,getBoundingClientRect()
方法的返回值,如果没有根元素(即直接相对于视口滚动),则返回 null - boundingClientRect:目标元素的矩形区域的信息
- intersectionRect:目标元素与视口(或根元素)的交叉区域的信息
- intersectionRatio:目标元素的可见比例,即 intersectionRect 占 boundingClientRect
的比例,完全可见时为 1,完全不可见时小于等于0 - isIntersecting:目标元素当前是否可见
配置对象 option
root:指定目标元素所在的容器节点(即根元素),该元素必须是目标元素的祖先节点。如果未传入值或值为 null,则默认使用顶级文档的视窗
rootMargin:定义根元素的 margin,用来扩展或缩小 rootBounds 这个矩形的大小,从而影响
intersectionRect 交叉区域的大小。它使用CSS的定义方法,比如10px 20px 30px 40px,表示
top、right、bottom 和 left 四个方向的值threshold:决定了什么时候触发回调函数。它是一个数组,每个成员都是一个门槛值,默认为[0],即交叉比例(intersectionRatio)达到0时触发回调函数
由于懒加载设计,我的定义是整个视窗,因此我在源代码里没有加入option的配置,因此是null。
感谢阅读~~~~~
Concis组件库线上链接:http://react-view-ui.com:92
github:https://github.com/fengxinhhh/Concis
npm:https://www.npmjs.com/package/concis
Concis组件库封装——LazyLoad懒加载相关推荐
- 手写Vue个人组件库——fl-Lazyimg 图片懒加载
fl-Lazyimg图片懒加载 基础使用 将img绑定在fl-Lazyimg标签中,设置img的src-data为图片路径即可使用. [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上 ...
- 在ThinkPHP框架(5.0.24)下引入Ueditor并实现向七牛云对象存储上传图片同时将图片信息保存到MySQL数据库,同时实现lazyload懒加载...
这是我花了很多天的时间才得以真正实现的一组需求. 文章后面有完整Demo的GitHub链接. 一. 需求描述 1. 应用是基于ThinkPHP5开发的: 2. 服务器环境是LNMP,PHP版本是7.2 ...
- php ajax 懒加载demo,lazyload懒加载,怎么支持ajax获得的新内容?
lazyload懒加载,怎么支持ajax获得的新内容? 现在问题是: 1.老的内容已经$("img.lazy").lazyload({effect: "fadeIn&qu ...
- Vue组件代码分块和懒加载
前端开发中,随着业务和页面增加,以组件为基本单位的结构下,组件数量会增长极快,为了优化我们会很显然地想要进行一些工作: 代码分块 懒加载非必要资源文件 非必要资源,指的首次渲染出某页面所不必要的资源, ...
- jQuery lazyload 懒加载
Lazy Load 是一个用 JavaScript 编写的 jQuery 插件. 它可以延迟加载长页面中的图片. 在浏览器可视区域外的图片不会被载入, 直到用户将页面滚动到它们所在的位置. 这与图片预 ...
- Concis组件库封装——Badge徽标
徽标其实和上文的Avatar头像是配套的,通常徽标的需求都是在头像的基础上提供的,因此本文将介绍徽标组件的封装,徽标其实是一个展示类组件,并没有什么交互,因此这个组件实现起来比较简单~ 先看一下组件库 ...
- Concis组件库封装——Rate评分
Rate评分组件官方文档如下: 源码如下: import React, { FC, useState, useEffect, memo, useCallback } from 'react'; imp ...
- Vue组件库实现按需加载功能
文章目录 简述 示例 原理 babel-plugin-component element-ui按需引入 babel-plugin-import 组件分开打包以及全部打包 组件分开打包 组件全部打包入口 ...
- jQuery.lazyload懒加载
注意事项:jquery.js务必先引进,然后才加载lazyload:img长宽一定要有,每幅长宽可以不一致:在js段,可以不用$(window).ready来加载事件: 1.将图片路径写入data-o ...
最新文章
- java字节流6_JavaIO流之字节流
- 袁国勇院士团队纳米孔测序揭示人和禽流感病毒新型检测和监测靶点
- Python决策树可视化Graphviz下载地址
- JavaScript中的数组操作
- [zz]kvm环境快照(snapshot)的使用方法
- python恶搞程序-愚人节恶搞程序源码【两种语言】
- AsyncTask应用解析
- Codeforces 429 A. Xor-tree
- oracle 截取中英文混合_C语言截取中英文混合字符串
- HTML/CSS学习笔记02【表单标签】
- jsonp和CORS跨域实现
- Qt tableWidget导入\导出Excel表格 自用
- 软件开发中的V字模型与W模型(使开发与侧试分离)
- Ubuntu Server Nginx 下配置 mono 下运行 asp.net mvc
- 关于圆与直线所包含点的多少关系证明
- Atitit 软件开发基本法 目录 1. 第一章 总纲(包含各大原则 定律 法则)	1 2. 爱提拉的原则	3 2.1. 简单原则 KISS	3 2.2. 提升可读性 面向人类编程 而不是面向机
- 数学方法论选讲---第一章 引论
- ttest求pvalue_TTEST 在EXCEL计算出的结果是t还是p值,用哪一个公式在excel中计算出t值和p值是多少...
- VMware copy之后,如何查看网卡地址 HWADDR
- “微肥”还是“歪fai”