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

11|组件实战:如何实现瀑布流?

你好,我是蒋宏伟。
现在,国内购物 App 的首页大都采用了双列瀑布流的布局,假如你的产品经理也想实现同样的瀑布流效果,你在网上找了很多的 React Native 列表组件,但都满足不了需求,你会怎么办?你会选择改让产品改方案,还是自己再研究研究?
大概是 2019 年的时候,我们的产品也提了同样的需求,使用 React Native 实现瀑布流效果。当时我们有个同事试了很多方案,比如双 List、多层嵌套 List,性能都很差效果不好,后来我们开会的时候提到了这个问题,我也参与了讨论。
当时我提出了一种思路:改 RecyclerListView 的源码。我说,RecyclerListView 的布局原理是绝对定位,每个 item 的 x、y 轴坐标是根据传入的 height、width 值算出来的,现在它的布局算法是单列的,我们只要把单列布局算法改成双列布局算法,这件事情应该能成。
后来我们团队的另一个大牛把它落地实现了,实现了一个 React Native 瀑布流页面。
在准备写实战案例的时候,我又想起了当初的这个事情。使用瀑布流的业务场景很多,却没有直接能用的开源方案,但它的实现原理其实并不复杂,应该是一个很好的实战案例。于是我就基于 RecyclerListView 最新的版本,又实现了一版。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入介绍了作者如何通过修改 RecyclerListView 组件的源码,实现了瀑布流效果。作者首先强调了准备开发调试环境的重要性,并详细介绍了在 React Native 中如何调试第三方模块 RecyclerListView 的方法,同时提到了调试工具 Flipper 的功能和使用。接着,作者分享了修改 RecyclerListView 源码的关键步骤,包括改变模块路径和解决报错的过程。通过分析 RecyclerListView 组件的源码,读者可以了解到该组件渲染出的 UI 页面由滚动容器和若干个 ViewRenderer 容器组成。此外,文章还介绍了状态、props 和 ViewRenderer 之间的关系,以及 LayoutManager 类的关键方法和实现双列瀑布流布局的思路。对于想要深入了解 React Native 组件源码修改的读者来说,这是一篇非常有价值的文章。文章通过实例和代码解析,帮助读者深入理解了单列布局和双列瀑布流布局的原理,同时提供了修改源码的关键技巧和方法。整体而言,本文对于想要深入学习 React Native 组件源码修改的读者具有很高的参考价值。

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

全部留言(13)

  • 最新
  • 精选
  • dao
    三列布局还没有来得及写,单纯抄老师的思路来搞两列的瀑布布局就花了好几个小时。用上了 npm 包的几种修改方式——这是个额外的收获。(https://github.com/hdouhua/hybrid-mobile-app/tree/main/AwesomeProject/src/c11) 要扩展这个组件的瀑布布局就必须阅读源码。阅读源码是很有必要的,也是每个程序员成长和进阶的必经之路!

    作者回复: 点赞👍 实现三列布局的关键是理解 瀑布流 每一项该放哪。

    2022-05-09
    2
  • 大神博士
    没有现成的高性能瀑布流组件吗,改开源库源码也不是很方便呐

    作者回复: 现在没有哦

    2022-05-25
  • geeklyc
    老师,对于列表垂直滑动吸顶,水平也可以滑动的切换不同的列表,有什么好的实现不?

    作者回复: 淘宝首页的效果是吧? 社区有实现,不过代码有点老了,完整 demo 我放在了 Github 手势库 Gesture 的目录下了(过几天上传)。 关键库如下: import { HScrollView } from 'react-native-head-tab-view' import { CollapsibleHeaderTabView } from 'react-native-tab-view-collapsible-header'

    2022-04-27
  • 学习中...
    大佬,这种方式会影响RecyclerListView的复用逻辑吗,感觉这种方式布局view复用逻辑会有问题?

    作者回复: 不会。 从原理层面,你可以用 Flipper 查看 Tree 的销毁、复用。 从实践层面,你可以用 Xcode AS 等工具查看内存使用情况。

    2022-04-22
  • 贺子华
    运行时修改这个方法没太理解

    作者回复: 直接上代码吧,看了就懂: https://github.com/jiangleo/react-native-classroom/tree/main/src/11_Waterfall/lib/RecyclerListView

    2022-04-21
    2
  • songyq
    这个学习曲线有点陡峭
    2022-08-05归属地:美国
    4
  • 学习中...
    老师讲的很好,不过试用了demo和结合自己实际项目中的需求来说,魔改RecyclerListView成瀑布流之后还是需要在layoutProvider中设置Dimension.width和height,但是在需求上有可能UI并不能确定好当前瀑布流item的高度,也就是无法说我区分type的方式来确定item,例如文字一行两行多行等需要在item进行了layout之后才能确定,我们没有办法measure,这样的话如果在item的onLayout之后再次刷新高度的话就会出现抖动等问题了。 请教老师一下这种情况有什么解决办法吗?是否能够让recyclerListView和FlatList一样在布局的时候可以自己动态的计算高度或者宽度进行布局呢
    2022-06-15
    1
    3
  • wilson
    我按着修改完后,瀑布流效果是有了,但是为啥不能滑动了。一滑动就卡死
    2022-07-04
    1
  • python4
    长见识了,以前都是直接复制
    2022-04-23
    1
  • 大神博士
    为什么不用嵌套原生视图的方式?
    2023-04-30归属地:上海
收起评论
显示
设置
留言
13
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部