React Hooks 核心原理与实战
王沛
eBay 中国研发中心资深技术专家
10740 人已学习
新⼈⾸单¥59
登录后,你可以任选2讲全文学习
课程目录
已完结/共 25 讲
React Hooks 核心原理与实战
15
15
1.0x
00:00/00:00
登录|注册

10|函数组件设计模式:如何应对复杂条件渲染场景?

你好,我是王沛。今天我们来聊聊函数组件中的设计模式。
所谓设计模式,就是针对特定场景,提供一种公认的最佳实践在前面的课程中,我们已经提到了不少模式,比如保证状态的唯一数据源,语义化的拆分复杂组件,等等。熟练掌握这些模式,可以让我们的代码更加简洁直观。
那么今天这节课我会介绍另外两个模式:
一个和 Hooks 相关,用于解决 Hooks 无法在条件语句中执行带来的一些难题;
另一个则是经典的 render props 模式,用于实现 UI 逻辑的重用。

容器模式:实现按条件执行 Hooks

第 2 讲我们介绍了 Hooks 的一个重要规则,即:Hooks 必须在顶层作用域调用而不能放在条件判断、循环等语句中,同时也不能在可能的 return 语句之后执行。换句话说,Hooks 必须按顺序被执行到。
这个规则存在的原因就在于,React 需要在函数组件内部维护所用到的 Hooks 的状态,所以我们无法在条件语句中使用 Hooks,这因而会给我们实现业务逻辑带来一定的局限。
比如说,对于一个对话框组件,通过 visible 属性来控制是否显示。那么在 visible 为 false 的时候,其实不应该执行任何对话框内部的逻辑,因为还没展示在 UI 上。
需要注意,只有在 visible 为 true 的时候才应该去执行业务逻辑,展现数据。那么我们期望的代码可能是下面的方式:
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

函数组件设计模式中的容器模式和 render props 模式是针对复杂条件渲染场景的最佳实践。容器模式通过将条件判断的结果放到两个组件之中,确保真正渲染 UI 的组件收到的所有属性都是有值的,从而间接实现了按条件执行 Hooks 的逻辑。而 render props 模式则是用于实现 UI 逻辑的重用,通过将逻辑封装在一个组件中,并通过 props 的方式传递给子组件,可以实现逻辑的复用,提高代码的可维护性和可复用性。这两种设计模式在函数组件中的灵活应用,可以使代码更加简洁直观,减少条件判断语句的使用,同时确保每个组件尽量短小,易读易维护。虽然 Hooks 能够替代 render props 这个设计模式,但在涉及 UI 表现逻辑的重用时,仍需借助于 render props 的逻辑。因此,掌握这些设计模式可以让函数组件在处理复杂条件渲染场景时更加灵活和高效。

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

全部留言(13)

  • 最新
  • 精选
  • 何用
    UserInfoModalWrapper 考虑 Modal 动画了吗?这种改写不是等价的,会散失动画效果

    作者回复: 很好的问题。如果考虑动画的场景,那么 visible 从 false -> true 是会默认保留动画;如果是 true -> false,那取决于什么时候设置 visible。比如对于 antd 的 Modal,可以在 afterClose 事件里再去设置 visible 为 false,也就是动画结束后才是真正的 visible=false,那就会保留动画了。所以这属于具体如何封装的实现细节,具体情况具体考虑,总体的模式是不变的。

    2021-06-18
    2
    6
  • 林斌
    第一个demo不想展示的话,直接在父级 visible && <UserInfoModal /> 不就好了吗? 不知道为什么要多一层嵌套~

    作者回复: 文中提到,可能是属性组合不只visible,根据不同的状态来决定是否要 render 真正的组件,这部分逻辑属于 Modal 组件,不应该由调用者去实现。

    2021-07-27
    2
    4
  • 知鱼
    后期会有视频吗?

    编辑回复: 没有啦,知鱼同学~这次王沛老师带来的是专栏,主要是文字➕音频的形式哦~对于React Hooks的学习来说完全够用了,老师也讲得很清晰。

    2021-06-18
    3
  • Free fall
    做过一个文件预览的功能,根据选中的文件类型,用对应的插件预览
    2021-06-17
    7
  • 阿禹。
    antd中表单组件也是有用到render props模式。确实在有些地方很灵活。
    2021-07-04
    4
  • ChenQinf
    render props作用可以理解成vue中的slot吗
    2022-02-22
    2
    1
  • Osmond
    感觉很多UI组件比如说antd 的组件,就很像是用了render props实现了组件的重用吧
    2021-12-20
    1
  • 与你.
    学react的时候直接学过hooks, 对于这个render props好像还是不理解
    2021-06-17
    1
    1
  • Jackchoumine
    render props 可用于表中自定义列。
    2023-06-06归属地:贵州
  • Jun Ma
    CountRenderProps有点绕。我说下我的理解: 1、这个render props的children 实际上是一个函数, 而不是UI组件。 每一个组件都拥有props, 而props.children 就指代了 开始tag和结束tag 的内容, props里面其实还包含了标签自己的一些需要传递的属性。 2、在CountRenderProps 里面,通过children这个形参,执行了这个函数。 而且,执行的时候,我们传递给了children三个参数,count,increase,decrease。 函数的具体形式,则是由外部的父组件使用时去定义,而且在定义的时候,我们可以拿到这三个参数,有点类似于回调函数。
    2022-08-19归属地:四川
    1
收起评论
显示
设置
留言
13
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部