剖析源码:浅谈react-infinite的机制与原理

  最近又读了一个轮子的源码,react-infinite,虽然star数量不是特别多,1.5k,不过还是个非常实用的轮子,今天给大家讲的是它的原理和实现,并不是如何去使用它,如何使用官方文档上都有。了解了它的原理,你就不一定要全盘使用它,你可以自己剥离一部分实际要用的东西出来,自己写一个合适的轮子用到项目中去(不要为了一个功能去使用一整个框架或者插件)。
  说了那么多废话,它是用来干嘛的?

  官方解释:A browser-ready efficient scrolling container based on UITableView.

  基于UITableView的浏览器端高效滚动容器。本质上它就是利用了原生App的滚动容器原理,让我们可以在浏览器端享受到近原生的滚动体验。

  它解决的主要问题是:无限滚动,导致当前页面元素数量太多,切换视图再切回来时一次性渲染大量元素,会造成卡顿。

  那么正常人的思路来说,我们需要对不在可视区域的元素做回收,只显示在可视区域和即将要显示的部分,这样性能会有大幅提升。

  我们都知道移动端有UIWebView,UITableView,UIScrollView等等各种View。原生App性能为什么强?是天生强么,还不是OC和Java,能比C快么?关键人家优化的好啊,把各种常用组件都给你封装好了,移动端的UIScrollView其实就是对上面这种情况做了优化的,在移动端,会有一个坐标系,你会有很多View铺在坐标系上,你的视口是固定的,这时候我们只需要拉动后面的坐标系,整个屏幕看起来就滚动起来了,那么其中在可视区域的那些View就被渲染了,而不可视区域就被隐藏起来了。

  对应到浏览器端,其实也是差不多,通过剖析react-infinite的作用机制和源代码,它是这么实现的:

  组件允许你设置成内滑或者使用window的滚动条。加载页面时,如果你想用window的滚动条,而不是内滑,那么它就不会创建容器,他会在你渲染的节点下面加载元素。

  这边需要注意的是:它会在你列表元素的首部和尾部都添加两个空的<div>,最头和最尾部的元素是用来撑滚动条的,第二个和最后第二个空<div>是用来加载loading图标的。在滚动视图的过程中,每过一定距离,它会把离当前可视区域最远的那部分元素移除,放在内存里,然后用撑滚动条的那个空<div>来替换他们,给空div加一个高度,和这些移除的元素一样高,这样,滚动条就会保持原位。反方向滚动,会把之前移除的元素重新插入到之前的位置,然后将高度减小,另一边的空<div>高度就会增加,并会移除一些离可视区域远的元素。所以存在的元素始终只有可视区域和即将可视的元素。
  至于上拉加载,下拉刷新,很简单,判断 视口区域的固定高度 + 滚动条滚动的距离 > 滚动区域的高度 - 你设置的开始加载的边界值offset,为true就fetch数据,当然,一旦fetch数据了,要加一个状态变量,防止滚动事件多次进入条件判断,加载完了再把状态变量还原。

  知道原理了,要实现这么一个组件应该不是太难,关键逻辑就是,每移动固定距离,就触发一个函数,将固定数量的元素从dom移除,再把空div的高度增加,另外一边,就是相反的逻辑,添加回移除的dom,把空div的高度减小。

  

  

时间: 2024-12-21 02:25:07

剖析源码:浅谈react-infinite的机制与原理的相关文章

【Android测试】【第七节】Monkey——源码浅谈

前言 根据上一篇我们学会了Monkey的用法,知道了Monkey可以非常容易的模拟伪随机的模拟事件.也许有的时候我们想让他稍微智能化一些,例如只在某个屏幕范围产生伪随机事件,或者说是只对某些指定Activity进行操作,这样就需要我们对Monkey进行改良了.而改良必须去改Monkey的源码,因此本节课们就简单的说说Monkey的源码. 源码下载地址:https://code.google.com/p/android-source-browsing/source/browse/cmds/monk

【Android测试】【第三节】ADB——源码浅谈

前言 由于本人水平有限,所以这里简单的说说ADB源码. 首先根据前面的理解,我们已经知道了ADB是“连接手机和PC的一个桥梁”,我们经常在PC端开发的时候,会用到eclipse这个工具,这里面有一个工具叫DDMS,如下图: 是不是发现通过DDMS在PC端可以看到手机的一些信息,其实呢 它就是通过 “ddmlib.jar” 来建立起ADB的.因此我们今天就通过反编译 “ddmlib.jar” 来分析一下ADB源码. 反编译 首先不得不吐槽一下百度经验的审核人员,我看到里面“反编译jar”的经验没有

源码浅谈(一):java中的 toString()方法

前言: toString()方法 相信大家都用到过,一般用于以字符串的形式返回对象的相关数据. 最近项目中需要对一个ArrayList<ArrayList<Integer>> datas  形式的集合处理. 处理要求把集合数据转换成字符串形式,格式为 :子集合1数据+"#"+子集合2数据+"#"+....+子集合n数据. 举例: 集合数据 :[[1,2,3],[2,3,5]]  要求转成为 "[1,2,3]#[2,3,5]"

【转】浅谈React、Flux 与 Redux

本文转自<浅谈React.Flux 与 Redux>,转载请注明出处. React React 是一个 View 层的框架,用来渲染视图,它主要做几件事情: 组件化 利用 props 形成单向的数据流 根据 state 的变化来更新 view 利用虚拟 DOM 来提升渲染性能 前面说到 React 能够根据 state 的变化来更新 view,一般来说引起 state 变化的动作除了来自外部(如服务器),大部分都来自于页面上的用户活动,那页面上的用户活动怎样对 state 产生作用呢?Reac

浅谈浏览器的缓存机制

浏览器的缓存可分为HTTP缓存和离线缓存,下面将分别介绍 HTTP缓存 只有GET请求能被缓存,POST不能被缓存.Modified Time/ETag/Expires/Cache都是HTTP协议的缓存策略 先来一个例子 当我们第二次访问百度首页,在Chrome的Network面板中打开一个静态文件时会发现响应的status是:200 OK (from disk cache),不是应该返回304 Not Modified吗?如果你知道答案,那就可以忽略本文了. Cache-Control 简介

hbase源码系列(十三)缓存机制MemStore与Block Cache

这一章讲hbase的缓存机制,这里面涉及的内容也是比较多,呵呵,我理解中的缓存是保存在内存中的特定的便于检索的数据结构就是缓存. 之前在讲put的时候,put是被添加到Store里面,这个Store是个接口,实现是在HStore里面,MemStore其实是它底下的小子. 那它和Region Server.Region是什么关系? Region Server下面有若干个Region,每个Region下面有若干的列族,每个列族对应着一个HStore. HStore里面有三个很重要的类,在这章的内容都

源码深度解析SpringMvc请求运行机制(转)

源码深度解析SpringMvc请求运行机制 本文依赖的是springmvc4.0.5.RELEASE,通过源码深度解析了解springMvc的请求运行机制.通过源码我们可以知道从客户端发送一个URL请求给springMvc开始,到返回数据给客户端期间是怎么运转的. 1.用户请求处理过程: 1.用户发送请求时会先从DispathcherServler的doService方法开始,在该方法中会将ApplicationContext.localeResolver.themeResolver等对象添加到

【转】Android 带你从源码的角度解析Scroller的滚动实现原理

今天给大家讲解的是Scroller类的滚动实现原理,可能很多朋友不太了解该类是用来干嘛的,但是研究Launcher的朋友应该对他很熟悉,Scroller类是滚动的一个封装类,可以实现View的平滑滚动效果,什么是实现View的平滑滚动效果呢,举个简单的例子,一个View从在我们指定的时间内从一个位置滚动到另外一个位置,我们利用Scroller类可以实现匀速滚动,可以先加速后减速,可以先减速后加速等等效果,而不是瞬间的移动的效果,所以Scroller可以帮我们实现很多滑动的效果. 在介绍Scrol

【iScroll源码学习03】iScroll事件机制与滚动条的实现

[iScroll源码学习03]iScroll事件机制与滚动条的实现 前言 想不到又到周末了,周末的时间要抓紧学习才行,前几天我们学习了iScroll几点基础知识: 1. [iScroll源码学习02]分解iScroll三个核心事件点 2. [iScroll源码学习01]准备阶段 3. [iScroll源码学习00]模拟iScroll 今天我们来学习其事件机制以及滚动条的实现,完了后我们iScroll就学习的差不多了,最后会抽离iScroll的精华部分组成一个阉割版iScroll 并总结下iScr

Redis源码阅读(一)事件机制

Redis源码阅读(一)事件机制 Redis作为一款NoSQL非关系内存数据库,具有很高的读写性能,且原生支持的数据类型丰富,被广泛的作为缓存.分布式数据库.消息队列等应用.此外Redis还有许多高可用特性,包括数据持久化,主从模式备份等等,可以满足对数据完整有一定要求的场景. 而且Redis的源码结构简单清晰,有大量材料可以参阅:通过阅读Redis源码,掌握一些常用技术在Redis中的实现,相信会对个人编程水平有很大帮助.这里记录下我阅读Redis源码的心得.从我自己比较关心的几个技术点出发,