首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

长列表优化:用 React 实现虚拟列表

将需要渲染的元素一个 div 包裹起来,对这个 div 应用 transform: translate3d(0px, 1000px, 0px); 对每个列表项使用绝对定位(或 transform) 这里我们选择第一个方案来进行实现...我这里使用的是 React18,默认是并发模式,更新状态 setState 是异步的,因此在快速滚动的情况下,会出现渲染不实时导致的短暂空白现象。...组件会通过这个函数,来拿到不同列表项的高度,来计算出 offsets 数组。offsets 是每个列表项的底边到顶部的距离。offsets 的作用是在滚动到特定位置时,计算出需要渲染的列表项有哪些。...虚拟列表组件通过 ref 提供了一个 resetHeight 方法来重置缓存的高度。...本文中虚拟列表组件的 API 参考了 react-window 库。如果你需要在生产环境使用虚拟列表,推荐使用 react-window,它的功能会更强大。

4.2K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    为了秋招,我开发了一款页面元素高亮插件

    #3 副作用 最后一步是对上边两个方法对调用,同时注意我们需要通过ReactDOM.render的API将React组件渲染到刚才的创建的节点上。 这里为什么不用传送门?...scrollTop, scrollLeft 当前容器的滑动距离,用来解决弹出层在滑动场景的定位 那么其实核心代码特别简单: const x = (clientWidth +...一个是选区内重复文字的问题,这促使我们只能通过索引的方式来定位被替换的元素。...#2 可遍历操作链路 如果要做到撤销和反撤销,就意味着我们要能做到以下三点: 我们可以通过某种方式再次定位到用户选择的选区 我们可以定位到自己添加的节点 保存插入的HTML内容以及被插入的TEXT 所以我们的...这样处理出来的XPath类似于 'id("gatsby-focus-wrapper")/DIV[1]/DIV[1]/DIV[2]//DIV[2]/DIV[1]/DIV[2]/DIV[2]' 再次使用的时候可以通过

    1.1K30

    导航栏滚动吸顶并自动高亮和点击跳转锚点

    实现方法 正常情况下我们点击自动定位到其所在位置一般用id锚点的方式,但是这种方式有一个缺陷就是无法实现滚动条缓动效果,而且带url上还会通过hash的方式显示出ID,另外也无法实现滚动到内容所在位置自动高亮导航栏...我这次采用的是react来写,具体思路都是相同的,无论你用的是vue还是angular 还是使用jq还是原生js,都是一样的。...下面我们来看一下导航栏吸顶和滑动到指定位置导航栏高亮的逻辑。...这样我们就实现了通过滚动条来控制导航栏高亮的效果了,接下了我们要实现的便是点击导航栏自动定位到其所在内容。...onClick={()=>navClick(item.id)} >{item.name} 下面来看具体的实现逻辑 //先定义两个变量 /*上一次滚动条距顶部位置,此变量是为了防止底部高度不够时, 无法定位到最下方

    10.5K50

    h5软键盘挡住输入框问题解决(android)

    :scrollIntoViewIfNeeded()、scrollIntoView(),使用方法自行百度。...第二种会出现遮挡问题 于是想到以下两种方案: 1.通过动态增加页面高度和设置scrollTop来使输入框到达合适的位置 2.设置相对定位,通过top来使输入框到达合适的位置 影响实现的两个点: 1.js...直接上代码,这里是react项目(css设置absolute配合js改变top实现效果,transition过渡增强用户体验,这里就不放了) getElementOffsetTop(el) {...clientHeight/3 // 定位高,弹出键盘时input距浏览器上部的距离,自己定义合适的 // 符合需弹出键盘的元素query const queryStr = '...第二,如果点击键盘上的收起键盘按钮,会导致页面top无法恢复,因为没有触发输入框失焦方法,需点击空白处恢复。

    6.5K10

    了解虚拟列表背后原理,轻松实现虚拟列表

    在项目中,大数据渲染常常遇到,比如umy-ui(ux-table)虚拟列表table组件,vue-virtual-scroller以及react-virtualized 这些优秀的插件快速满足业务需要...,并且根据显示总数动态设置一个装载容器的高度 每个元素设置绝对定位,且是固定高度 有了对应设置的结构,因为我们每个元素是绝对定位的,所以我们现在的思路就是: 1、确定可视区域item显示的条数limit...} = e.target; // 计算当前滚动的位置,获取当前开始的起始位置 const currentIndex = Math.floor(scrollTop...总结 了解虚拟列表到底是什么,在大数据渲染中,选择一段可视区域显示对应数据 实现虚拟列表的背后原理,最外层给定一个固定的高度,然后设置纵向Y轴滚动,然后每个元素的父级设置相对定位,设置真实展示数据的高度...当滚动条上滑时,计算出滚动的距离scrollTop,通过currentIndex = Math.floor(scrollTop/rowHeight)计算出当前起始索引 根据endIndex = Math.min

    3.5K10

    手把手带你10分钟手撸一个简易的Markdown编辑器

    ,我也给大家提供了一个在线体验的地址 (opens new window),因为做的比较仓促,欢迎大家给我提意见和pr 具体实现 具体的实现也是按照我们上述列出来的功能的顺序来一一实现的 说明:本文通过循序渐进的方式讲解...提供的dangerouslySetInnerHTML属性,详细的使用可以看React 官方文档(opens new window) 此时一个简单的markdown语法解析功能就实现了,来看看效果 ?...编辑区和展示区的可视高度是一样的,但一般编辑区的内容经过markdown渲染后,总的滚动高度是会高于编辑区总的滚动高度的,所以我们无法仅凭scrollTop和scrollHeight使得两个区域同步滚动...markdown-editor-reactjs (opens new window)中,已经完成了其它工具的实现,想要看代码的可以去源码里看 七、补充 为了保证包的体积足够小,我将第三方依赖库、markdown主题、代码高亮主题都通过外链的形式导入了...,希望大家多多支持~(其实我已经悄悄发布,但因功能还不是太完善,就不先拿出来给大家使用了,这里简单放个npm包的地址 (opens new window))

    2.1K10

    手把手带你10分钟手撸一个简易的Markdown编辑器

    ,我也给大家提供了一个在线体验的地址 (opens new window),因为做的比较仓促,欢迎大家给我提意见和pr 具体实现 具体的实现也是按照我们上述列出来的功能的顺序来一一实现的 说明:本文通过循序渐进的方式讲解...提供的dangerouslySetInnerHTML属性,详细的使用可以看React 官方文档(opens new window) 此时一个简单的markdown语法解析功能就实现了,来看看效果 两边确实正在同步更新...先来看看原先的设计思想 编辑区和展示区的可视高度是一样的,但一般编辑区的内容经过markdown渲染后,总的滚动高度是会高于编辑区总的滚动高度的,所以我们无法仅凭scrollTop和scrollHeight...markdown-editor-reactjs (opens new window)中,已经完成了其它工具的实现,想要看代码的可以去源码里看 七、补充 为了保证包的体积足够小,我将第三方依赖库、markdown主题、代码高亮主题都通过外链的形式导入了...~(其实我已经悄悄发布,但因功能还不是太完善,就不先拿出来给大家使用了,这里简单放个npm包的地址 (opens new window))

    1.5K20

    H5 页面列表缓存方案

    思考 状态丢失的原因 通常在页面开发中,我们是通过路由去管理不同的页面,常用的路由库也有很多,譬如:React-Router (https://react-guide.github.io/react-router-cn...所以只能是在路由层做手脚,在路由切换时做对应的缓存操作,之前有开发者提出了一种方案:通过样式来控制组件的显示/隐藏 (https://github.com/facebook/react/issues/12039...),但是这可能会有问题,例如切换组件的时候无法使用动画,或者使用 Redux、Mobx 这样的数据流管理工具,还有开发者通过 React.createPortal API 实现了 React 版本的 React...Keep Alive (https://github.com/Sam618/react-keep-alive),并且使用起来也比较方便。...简单使用 import React from 'react' import { connect } from 'react-redux' import cacheHoc from 'utils/cache_hoc

    1.6K20

    聊聊苹果营销页中几个有趣的交互动画

    粘性定位 sticky 可以简单的认为是 「相对定位 relative」 和 「固定定位 fixed」 的混合,元素在跨越指定范围前为相对定位,之后为固定定位。...思路大致是首先绘制第一张图片,作为底图,然后我们通过绘制第二张图片,覆盖掉部分第一张图片,这样就可以实现前面提到的效果。...ctx.drawImage(image, dx, dy, dWidth, dHeight),可以参考笔者写的 使用 React Hooks 实现仿石墨的图片预览插件[7],这次用到了 7 个参数,大家可以参考这篇文章...笔者使用 react Hooks 来完成这两个动画效果,并使用 umi 快速初始化一个项目,具体的初始化步骤可以参考笔者写的 dva理论到实践——帮你扫清dva的知识盲点[10],里面详细介绍了如何使用脚手架快速搭建一个项目...「粘性定位」、「滚动视差」、「Canvas 画图」、「matrix 属性的使用」 等等,希望对大家有所帮助。

    1.9K60

    虚拟列表与 Scroll Restoration

    但是有关于回退页面无法回到虚拟列表上一次的位置的文章却很少。默认情况下,在后退页面时,浏览器会自动回到上一次浏览的位置。...这样有个问题是虚拟列表无法知道当前的位置原来是什么内容,因为虚拟列表都是按照单个 Node 高度去计算的,整体高度是一个预估值,不能知道当前位置具体是什么。...之后,我又找到一个比较小众的库, virtual-scroller ,不仅仅可以在 React 使用,他独立封装了一个 Core,可以单独在各个框架中使用,即使在 VanillaJS 中使用,小众的库功能肯定不会很多...选择此库的原因是他暴露了自身的 State,可以缓存每个 State 在之后的渲染中使用。...该库没有文档,没有 type definition,通过翻看源码我们可以知道,可以在 Router Change 之前获取到该组件的 Ref,记录下该组件的 State,在后面的渲染中注入 initialState

    89220

    虚拟滚动的 3 种实现方式!

    前言 工作中一直有接触大量数据渲染的业务,使用react-window多之又多,所以对虚拟列表有了些浅显的理解。今天,我们就照着react-window的使用方式来实现三种虚拟列表。...(3)采用绝对定位,计算上缓冲区到下缓冲区之间的每一个元素在contianer中的top值,只有知道top值才能让元素出现在可视区内。...思路 难点一: 由于每个元素高度不一,我们起先无法直接计算出container的总高度。 难点二: 每个元素高度不一,每个元素的top值不能通过itemSize * index直接计算出top值。...难点三: 每个元素高度不一,不能直接通过scrollOffset / itemSize计算出已被滚动掉的元素的个数,很难获取到可视区的起始索引。...unstable-height 每一个元素的top值都能通过上一个元素的top值 + 上一个元素的height计算出来。

    2.1K10

    react native 自定义下拉刷新——桥接MJRefresh

    0、React Native 中的下拉刷新、上拉更多一直是一个很让人头疼的问题,RN中的API只能使用默认的UIRefreshControl,定制和体验上都很差,下面我通过修改系统组件的方法桥接一个原生中常用的三方库...MJRefresh ,至于上拉更多我一般使用react-native-giftedListView,可以和我这个桥接完美结合。...(除非不更新RN) 1、在React 项目中引入MJRefresh包,注意,MJRefresj.bundle 要引入到自己项目中,不要放在React项目中,不然资源无法加载。...= nil && _rctRefreshControl.refreshing) { scrollTop -= _rctRefreshControl.frame.size.height; }...= nil && self.header.isRefreshing) { scrollTop -= self.header.frame.size.height; } 5、在RCTScrollViewManager.m

    2.2K80

    《最新出炉》系列入门篇-Python+Playwright自动化测试-50-滚动条操作

    还有就是在日常工作和学习中,经常会遇到我们的页面内容较多,一个屏幕范围无法完整展示内容,我们就需要滚动滚动条去到我们想要的地方,所以有时候我们就需要操作滚动条向下滚动的操作。...2.通过定位元素操作滚动条2.1原理当页面比较长,超过浏览器的高度时候,有些元素虽然没有显示,但是实际已经加载到页面上了,只是因为滚动条未滚动至下面,所以看不到。...()# 元素说明:找到class里包含‘react-grid-item’属性最后一个属性2.3实战接下来我们以163网站为例看一下该方法的使用。...如下图所示:4.JavaScript脚本操作滚动条4.1原理可以使用JS语句,定位滚动条的位置到最下面,从而实现页面的向下滚动。这种方法一般来说就是终极大招,如果这个都不行,可能就没有办法了。...4.2示例page.evaluate("var q=document.documentElement.scrollTop=滚动条的位置")4.3实战接下来我们以163网站为例看一下该方法的使用。

    34220

    学用Hooks写React组件——基础版Select组件

    作为码农当然不能满足于此所以 方案二: 通过React提供的createPortal来实现render body的方式渲染到body节点下,解决方案一的问题。...这里我们当然选择了render body的方案,整个组件思路是:点击显示组件,通过定位显示组件的位置来计算下拉框应该出现的位置。下拉框选中或者点击屏幕其他地方下拉框自动消失。选中后,显示对应的值。...这里使用了React.createProtal来创建root节点外的组件,参考:https://zh-hans.reactjs.org/docs/portals.html。...如果定位组件是在一个Scroll容器中,接收一个getContainer方法获取scroll容器,通过监听容器的scroll事件,来对定位组件进行移动,如果targetRef不在可视区域内了,调用onNotVisibleArea...使用React.cloneElement对props.children进行新的props传输,参考官网:https://zh-hans.reactjs.org/docs/react-api.html#cloneelement

    3.1K20
    领券