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

React Native列表之FlatList开发实用教程

在APP开发过程中,列表可谓是页面最重要一种展现形式了,几乎每一个APP都离不了列表,那么在这篇文章中将向大家分享在React Native中该如何实现列表,以及FlatList原理和实用指南。...滑动列表时会出现卡顿与不跟手:当因ListView中展示了大量数据时候,滑动列表你会发现没有少量数据时候跟手与流畅,这是因为ListView为了渲染大量数据需要大量内存和计算,这对手机资源是一个很大消耗...有能力公司、团队都纷纷对ListView做优化,封装自己列表组件,然对性能提升并不大,所以现在急需一个高性能列表组件,于是便有了设计FlatList构想; 那FlatList都有哪些特性能呢...(译注:这一段不了解朋友建议先学习下js中基本类型和引用类型。) 为了优化内存占用同时保持滑动流畅,列表内容会在屏幕外异步绘制。这意味着如果用户滑动速度超过渲染速度,则会先看到空白内容。...如果不指定此属性,则FlatList不会触发更新,因为它是一个PureComponent,其props在===比较中没有变化则不会触发更新

6.5K00

React Native 性能优化指南

} />; } } 和 shouldComponentUpdate 相对应,React 还有一个类似的组件 React.PureComponent,在组件更新前对 props 和 state 做一次浅比较...所以涉及数据嵌套层级过多时,比如说你 props 传入了一个两层嵌套 Object,这时候 shouldComponentUpdate 就很为难了:我到底是更新呢还是不更新呢?...:虚拟列表核心文件,使用 ScrollView,长列表优化配置项主要是控制它 FlatList:使用 VirtualizedList,实现了一行多列功能,大部分功能都是 VirtualizedList...4.Blank areas 空白 View,VirtualizedList 会把渲染区域外 Item 替换为一个空白 View,用来减少长列表内存占用。顶部和底部都可以有。...我们可以调节这两个参数来平衡渲染速度和响应速度。但是,调参作为一门玄学,很难得出一个统一「最佳实践」,所以我们在业务中也没有动过这两个属性,直接用系统默认值。

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

    react-native布局与组件

    VirtualizedList: 虚拟列表 替代ListView主要解决方案就是VirtualizedList。...RN0.43版本中引⼊了了FlatList,SectionList和VirtualizedList,其中VirtualizedList是FlatList和SectionList底层实现。 ?...FlatList 和 SectionList 底层实现:VirtualizedList通过维护一个有限渲染窗⼝(其中包含可⻅元素),并将渲染窗⼝之外元素全部用合适定⻓空⽩空间代替⽅式,极⼤改善了内存使...这个渲染窗⼝能响应滚动行为,元素离可视区越远优先级越低,越近优先级越高,当用户滑动速度过快时,会出现短暂空⽩情况。...这意味着如果用户滑动速度超过渲染速度,则会先看到空白内容。 (2)不支持分组列列表 扯了那么多理论,如果列表写不了想说自己懂rn是很扯。是时候开始写一个了。

    5.2K20

    React组件设计模式-纯组件,函数组件,高阶组件

    不要在props和state中改变对象和数组,如果你在你父组件中改变对象,你PureComponent将不会更新。...如果你有一列子对象并且其中一个子对象更新,对它们props和state进行检查要比重新渲染每一个子节点要快多。)(4) 何时使用Component 或 PureComponent ?...connect 和其他 HOC 承担装饰器角色)四、其他(1)key每当一个列表重新渲染时,React 会根据每一项列表元素 key 来检索上一次渲染时与每个 key 所匹配列表项。...如果 React 发现当前列表一个之前不存在 key,那么就会创建出一个组件。如果 React 发现和之前对比少了一个 key,那么就会销毁之前对应组件。...如果你没有指定任何 key,React 会发出警告,并且会把数组索引当作默认 key。但是如果想要对列表进行重新排序、新增、删除操作时,把数组索引作为 key 是有问题

    2.2K20

    React组件设计模式之-纯组件,函数组件,高阶组件

    不要在props和state中改变对象和数组,如果你在你父组件中改变对象,你PureComponent将不会更新。...如果你有一列子对象并且其中一个子对象更新,对它们props和state进行检查要比重新渲染每一个子节点要快多。)(4) 何时使用Component 或 PureComponent ?...connect 和其他 HOC 承担装饰器角色)四、其他(1)key每当一个列表重新渲染时,React 会根据每一项列表元素 key 来检索上一次渲染时与每个 key 所匹配列表项。...如果 React 发现当前列表一个之前不存在 key,那么就会创建出一个组件。如果 React 发现和之前对比少了一个 key,那么就会销毁之前对应组件。...如果你没有指定任何 key,React 会发出警告,并且会把数组索引当作默认 key。但是如果想要对列表进行重新排序、新增、删除操作时,把数组索引作为 key 是有问题

    2.3K30

    React性能探索 --- 避免不必要渲染

    分析更新时间 这里用reactPerf工具来测量重新渲染时间。...对于上面的写法,React提供了一个组件PureComponent来做这件事,它会自动浅对比props/state,当两者相同时候不渲染节点。...可以看到不应该重新渲染节点出现了Value did not change. Avoidable re-render!警告,是不是很实用!...关于如何在实际中使用这两个组件,还要根据具体实际情况来选择~ 总结 综上可以看出,减少不必要重新渲染对于提升我们性能有很大意义。...遗留点 PureComponent那么好用,但是使用PureComponent是有条件呀~ 由于PureComponent只是做了一个浅比较,所以深层嵌套对象跟数组都是比不出来,可能会导致需要渲染地方没有重新渲染错误展示

    1.1K60

    React性能探索 --- 避免不必要渲染

    分析更新时间 这里用reactPerf工具来测量重新渲染时间。...对于上面的写法,React提供了一个组件PureComponent来做这件事,它会自动浅对比props/state,当两者相同时候不渲染节点。...可以看到不应该重新渲染节点出现了Value did not change. Avoidable re-render!警告,是不是很实用!...关于如何在实际中使用这两个组件,还要根据具体实际情况来选择~ 总结 综上可以看出,减少不必要重新渲染对于提升我们性能有很大意义。...遗留点 PureComponent那么好用,但是使用PureComponent是有条件呀~ 由于PureComponent只是做了一个浅比较,所以深层嵌套对象跟数组都是比不出来,可能会导致需要渲染地方没有重新渲染错误展示

    79730

    Web 性能优化: 使用 React.memo() 提高 React 组件性能

    事件来提高性能 React.js 核心团队一直在努力使 React 变得更快,就像燃烧速度一样。...这里添加了两个生命周期方法来检测当我们两次设置相同状态时组件 TestC 是否会更新。...我添加了componentWillUpdate,当一个组件由于状态变化而确定要更新/重新渲染时,React 会调用这个方法;还添加了componentdidUpdate,当一个组件成功重新渲染时,React...注意: 1)继承 React.PureComponent 时,不能再重写 shouldComponentUpdate,否则会引发警告 Warning: ListOfWords has a method...3)浅比较会忽略属性或状态突变情况,其实也就是,数据引用指针没变而数据被改变时候,也不新渲染组件。但其实很大程度上,我们是希望重新渲染。所以,这就需要开发者自己保证避免数据突变。

    5.6K41

    React性能优化总结

    在 React 里时间耗时最多一个地方是 Reconciliation(reconciliation 最终目标是以最有效方式,根据新状态来更新 UI,我们可以简单地理解为 diff),如果不执行...使用原则 当你觉得,被改变 State 或者 Props,不需要更新视图时,你就应该思考要不要使用它。 需要注意一个地方是:改变之后,又不需要更新视图状态,也不应该放在 State 中。...组件懒加载 组件懒加载可以让 React 应用在真正需要展示这个组件时候再去展示,可以比较有效减少渲染节点数提高页面的加载速度 React 官方在 16.6 版本后引入了新特性:React.lazy...另外在业内也有一些比较成熟 React 组件懒加载开源库:react-loadable 和react-lazyload,感兴趣可以结合看下; 虚拟列表 虚拟列表是一种根据滚动容器元素可视区域来渲染长列表数据中某一个部分数据技术...,在开发一些项目中,会遇到一些不是直接分页来加载列表数据场景,在这种情况下可以考虑结合虚拟列表来进行优化,可以达到根据容器元素高度以及列表项元素高度来显示长列表数据中一个部分,而不是去完整地渲染长列表

    79420

    React Native之PureComponent

    具体解释 1> 使用PureComponent不要在props和state中改变对象和数组这种引用类型。即可变数据不能使用同一个引用。如果你在你父组件中改变对象,你“pure”子组件不将更新。...2> 不要在render函数中绑定值。即不变数据变化前后需使用同一个引用。 假设你有一个项目列表,每个项目都传递一个唯一参数到父方法。...这将造成列表不必要重新渲染。 你可以通过缓存你派生数据来解决这个问题。例如,设置派生数据在你组件state中,仅当posts更新时它才更新。...5> 复杂状态与简单状态不要共用一个组件 这点可能和 PureComponent 没多少关系,但做不好可能会浪费很多性能,比如一个页面上面一部分是一个复杂列表,下面是一个输入框,抽象代码: change...,表单值也可能经常变动,但它会给列表也带来必然 diff操作,这是没必要,最好是给列表抽出成一个单独 PureComponent 组件,这样 state.items不变的话,列表就不会重新 render

    7.6K22

    通过防止不必要重新渲染来优化 React 性能

    每次 App 组件渲染时都会创建一个样式对象,从而导致记忆中 Heading 组件更新。...如果每个列表元素都有一个一致键,那么即使添加或删除列表项,React 也可以避免重新渲染组件。...如果没有 上键,我们会收到警告列表每个孩子都应该有一个唯一“键”道具消息。...在可能情况下,为每个列表项分配一个唯一 ID——通常你会从后端数据库中得到这个。 Keys should also be stable....如果周围 DOM 结构发生变化,子组件将被重新挂载。例如,这个应用程序在列表周围添加了一个容器。 在更现实应用程序中,您可能会根据设置将项目放在不同组中。

    6.1K41

    Web 性能优化:缓存 React 事件来提高性能

    虽然 Button 是一个小型,快速渲染组件,但你可能会在大型,复杂,渲染速度组件上看到这些内联定义,它可能会让你 React 应用程序陷入囧境,所以最好不要在 render 方法中定义这些函数...this.instructions} ); } } 在这种情况下,SomeComponent 每个实例都有一个不同警告框...createAlertBox 内存中地址不会改变,这意味着 Button 不需要重新渲染,节省了处理时间并提高了应用程序渲染速度 但如果函数是动态呢修复(高级) 这里有个非常常见使用情况,在简单组件里面...class SomeComponent extends React.PureComponent { // SomeComponent每个实例都有一个单击处理程序缓存,这些处理程序是惟一。...这里使用 index 作为唯一标识会有个警告:如果列表更改顺序或删除项目,可能会得到错误结果。

    2.1K20

    歪门邪道性能优化:魔改三方库源码,性能提高几十倍!

    测试数据量 上面仅仅一个点击耗时就七八秒,是因为我故意用了很大数据量吗?不是!...说到这个我想起以前看到过一个资料,也是讲这个问题,他用了一个一万行列表来做例子,原文在这里:high-performance-redux。...但是我测试后发现并没有什么用,这7000个格子还是更新了,什么鬼?其实这是PureComponent本身一个问题:只进行浅比较。注意this.props[field] !...代码地址:github.com/jquense/rea… 这样会导致中间儿子节点每次接受到props虽然内容是一样,但是因为是一个新对象,即使使用了PureComponent,其运行结果也是需要更新...但是,目前这速度还是要三秒多,别说作为一个工程师了,作为一个用户我都忍不了。咋办呢?我们是真的有点黔驴技穷了。。。 看看上面那个性能图,主要消耗时间有两个,一个是click事件,还有个timer。

    64820

    「React进阶」 React全部api解读+基础实践大全(夯实基础万字总结)

    点击按钮,没有任何反应,因为PureComponent会比较两次data对象,都指向同一个data,没有发生改变,所以不更新视图。...②关于使用过时字符串 ref API 警告 ③关于使用废弃 findDOMNode 方法警告 ④检测意外副作用 ⑤检测过时 context API 实践:识别不安全生命周期 对于不安全生命周期...当它作为共享库一部分时才最有价值。在某些情况下,格式化值显示可能是一项开销很大操作。除非需要检查 Hook,否则没有必要这么做。...useTransition useTransition允许延时由state改变而带来视图渲染。避免不必要渲染。它还允许组件将速度较慢数据获取更新推迟到随后渲染,以便能够立即渲染更重要更新。...如果一次更新任务在flushSync回调函数内部,那么将获得一个较高优先级更新

    2.1K30

    React App 性能优化总结

    介绍 在 React 内部,React 会使用几项巧妙小技术,来优化计算更新 UI 时,所需要最少更新 DOM 操作。...另一方面,为了优化UI更新,我们可以考虑将函数组件转换为 PureComponent 类组件(或使用自定义 shouldComponentUpdate 方法类)。...但仅限于以下条件成立时: 列表和子元素是静态 列表子元素没有ID,列表永远不会被重新排序或过滤 列表是不可变 10.避免使用 `props` 来初始化 `state` (直接赋值) 我们经常需要将带有...记忆化 React 组件 Memoization是一种用于优化程序速度技术,主要通过存储复杂函数计算结果,当再次出现相同输入,直接从缓存中返回结果。...由于 sort 方法时间复杂度 O(n^2) ,它将减慢渲染速度,因为它们在同一个线程中运行。

    7.7K20

    为什么Elasticsearch查询变得这么慢了?

    3、开发维度—Elasticsearch查询原理 现在我们已经确定了一个很慢查询,我们通过一个分析器profile来运行它。 但是,查看单个组件时间结果并未使搜索速度更快。 怎么办?...路由节点识别正在搜索索引(或多个索引)。 路由节点生成一个节点列表,其中包含索引分片(主要和副本混合)。 路由节点将查询发送到节点(上一步节点列表列出节点)。 节点上分片处理查询。...(可能是包含最高得分文档一个分片,或者它们可能分散在多个分片中。) 返回列表后,主节点会在查询响应_hits部分中显示文档。...根本原因: 为了加速通配符和正则表达式匹配速度,Lucene4.0开始会将输入字符串模式构建成一个DFA (Deterministic Finite Automaton),带有通配符pattern...构造出来DFA可能会很复杂,开销很大

    17.2K31

    component和render在react router中应用

    在react router项目中,有这样一个需求,首先展示用户名列表,点击某个用户名后,根据用户名在后台取得用户具体信息在详情页进行展示。...此时可以将详情页封装成一个组件,利用react router将userId传递给详情页组件,详情页组件向后台请求数据,然后进行展示。...,发现页面并没有更新,这是由component属性性质决定,react会进行组件复用。...,componentDidUpdate中需要判断当前userId是否和原来userId一致,只有不一致时候才需要重新获取数据。...render 使用render则可以减少三分之一代码行数,此时详情页组件代码如下 import {PureComponent} from "react"; import React from "react

    1.8K40

    「框架篇」React 中 9 种优化技术

    它必须返回一个 Promise,该 Promise 需要 resolve 一个 defalut export React 组件。...当一个组件 props 或 state 变更,React 会将最新返回元素与之前渲染元素进行对比,以此决定是否有必要更新真实 DOM,当它们不相同时 React 会更新该 DOM。...即使 React 只更新改变了 DOM 节点,重新渲染仍然花费了一些时间。...仅在你 props 和 state 较为简单时,才使用 React.PureComponent,或者在深层数据结构发生变化时调用 forceUpdate() 来确保组件被正确地更新。...9 其他优化技术 虚拟化长列表 如果你应用渲染了长列表(上百甚至上千数据),我们推荐使用“虚拟滚动”技术。

    2.5K20
    领券