React Native 新架构实战课
蒋宏伟
58 同城前端架构师,58RN 负责人
18214 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 42 讲
React Native 新架构实战课
15
15
1.0x
00:00/00:00
登录|注册

08|List:如何实现高性能的无限列表?

你好,我是蒋宏伟。今天我们学习的重点是列表组件 RecyclerListView。
如果你熟悉 React Native ,那你可能会问了:“React Native 中的列表组件不是 FlatList 吗?”
没错。React Native 官方提供的列表组件确实是 FlatList,但是我推荐你优先使用开源社区提供的列表组件 RecyclerListView。因为,开源社区提供的 RecyclerListView 性能更好。
对于列表组件来说,我们最应该关心的就是性能。这里我给你分享下我的个人经历。2016~2018 年,我参与了一个用 React Native 搭建的信息流项目。信息流这种无限列表页是非常常见的业务场景,比如你使用的京东首页、抖音视频、微信朋友圈都属于信息流页面。你看完一页,还有下一页,看完下一页还有下下页,无穷无尽。这时就要用到我们马上要探讨的列表组件了,而且必须是高性能的列表组件,不能翻着翻着就卡起来了。
2016 年,没有 RecyclerListView,也没有 FlatList,我们用的是第一版的 ListView 组件。ListView 组件性能很差,没有内存回收机制,翻一页内存就涨一点,再翻一页内存又再涨一点。前 5 页滚动非常流畅,第 10 页开始就感觉到卡顿了,到 50 页的时候,基本就滑不动了。卡顿的原因就是无限列表太吃内存了。如果手机的可使用内存不够了,卡顿就会发生。这也是 React Native 刚出来时被吐槽得最多的地方。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

React Native中的列表组件性能优化问题一直备受关注。本文深入探讨了在处理无限列表时的性能挑战,并提出了解决方案。作者首先指出了早期使用的ListView组件存在的性能问题,随后对比了官方提供的FlatList和开源社区提供的RecyclerListView的性能差异。文章重点介绍了RecyclerListView的性能优势和底层实现原理,强烈推荐开发者使用RecyclerListView来提升无限列表的性能。此外,还详细介绍了FlatList和RecyclerListView的原理和优化方法,强调了RecyclerListView在内存和计算量上的优势。对于React Native开发者来说,这是一篇值得深入阅读的技术文章,通过对比ScrollView、FlatList和RecyclerListView的底层原理和性能特点,强调了RecyclerListView在内存和计算量上的优势,建议开发者优先使用RecyclerListView来提升无限列表的性能。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《React Native 新架构实战课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(13)

  • 最新
  • 精选
  • 卯熙
    老师, 按需渲染组件,数据还需要分页加载吗?是不是可以不用分页加载,一次性把数据请求回来,它会自动按需渲染。

    作者回复: 不建议一次请求回来。 1. 无限列表,理论上页码是无限的,不可能一次请求回来。因此,还需要对请求的数据进行分页。 2. 推荐使用 react query,帮你做列表的状态管理,只需配置一下就能帮你自动管理无限列表的分页。

    2022-05-01
    1
  • 山文宋
    老师,有比较好的RN的书或者资料推荐吗?

    作者回复: 在生态篇的《React Native Awesome》会有介绍。

    2022-04-13
    1
  • 持续思考持续做的牛牛
    现在新架构里面分支,0.68,有相应的listview优化么?怎么看不到对应的scrollview os库?rrc_scrollview这个组件是还没有完成么?

    作者回复: 只能重构了 ListView ,目前不支持复用,性能太差。

    2022-04-25
  • 持续思考持续做的牛牛
    对于item高度会变化的,能适配么?

    作者回复: 可以。12讲的 Github 上有代码。

    2022-04-25
  • dao
    作业 1, https://github.com/hdouhua/hybrid-mobile-app/tree/main/AwesomeProject/src/c08 2, 新手,工作中没有使用过,作业中有下面两个问题,请老师帮忙解答。 一,设置 loading 属性会引起 RecyclerListView 重新渲染 二,屏幕下方 “加载更多” 按钮,屏幕有一点抖动

    作者回复: 给动手能力点赞👍 一、会引起 RecyclerList 组件的 re-render,但不会引起 ListItem 组件的 re- render ,你可打日志试试。 二、 {loading && <Loading />},引起了高度的改变,所以有抖动。loading 状态只改变文案内容,不控制元素出现和消失就不会引起高度改变。

    2022-04-21
    2
  • geeklyc
    老师,有支持多列,瀑布流的不。RecyclerListView

    作者回复: 有,见 11 讲和 12讲

    2022-04-15
  • Geek_e4a05b
    RecyclerListView 在安卓底端机上暴力滑动底部有可能有闪动情况。RecyclerListView如果卡片高度不固定需要提前计算卡片高度,这个可能会牺牲展示时间。Flatlist可以通过指定windowSize来减少白屏出现,感觉性能比之前好很多了。

    作者回复: 你是小飞侠? 是的,现在性能越来越好了,但我还是推荐 RecyclerListView,因为低端机加载可能还是会遇到渲染 windowSize 多屏的白屏问题。

    2022-04-13
  • Luvian
    现在有一个新的flashList,原理和recycleList差不多,但是使用更简单
    2023-07-25归属地:上海
  • Duke
    最后一个列表项可枚举是什么意思?
    2022-11-16归属地:陕西
    1
  • IRONMAN
    你好,这个是我写的rowRenderer的函数: const _rowRenderer = (type,data)=>{ console.log(data,data.name) //编写如何渲染数据 return ( <View style={{height:100}}> <Text >data</Text> </View> ) } 但是在模拟显示的时候却报错: LayoutException: RecyclerListView needs to have a bounded size. Currently height or, width is 0.Consider adding style={{flex:1}} or, fixed dimensions 我明明已经明确了每一个列表项的height,为什么还会报错?但是一旦我重新刷新之后,报错就消失了,但是控制台中并没有打印我在rowRenderer函数中中指定的信息,所以为什么rowRenderer函数没有被调用?
    2022-06-29
收起评论
显示
设置
留言
13
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部