当前位置:首页 > 科技  > 软件

函数组件和函数式编程有关系么?

来源: 责编: 时间:2023-11-21 09:38:59 392观看
导读大家好,我卡颂。长期使用React的同学应该知道,React中存在两种组件:Class Component,类组件Function Component,函数组件既然提到「类」和「函数」,那么很自然的,我们会进一步思考:类组件和OOP(面向对象编程)有关系么?函数组件和

3hr28资讯网——每日最新资讯28at.com

大家好,我卡颂。3hr28资讯网——每日最新资讯28at.com

长期使用React的同学应该知道,React中存在两种组件:3hr28资讯网——每日最新资讯28at.com

  • Class Component,类组件
  • Function Component,函数组件

既然提到「类」和「函数」,那么很自然的,我们会进一步思考:3hr28资讯网——每日最新资讯28at.com

  • 类组件和OOP(面向对象编程)有关系么?
  • 函数组件和FP(函数式编程)有关系么?

毕竟,如果类组件和OOP有关,那么OOP中的思想(继承、封装、多态...)也能指导类组件的业务开发(函数组件与FP的关系同理)。换言之,我们可以直接用这些编程范式的最佳实践指导React项目开发。3hr28资讯网——每日最新资讯28at.com

那么,「函数组件」和「函数式编程」究竟是什么关系呢?本文会围绕这个话题展开讲解。3hr28资讯网——每日最新资讯28at.com

编程范式与DSL

首先,我们应该明确,「框架语法」本质是一种DSL(领域相关语言),他是为了「某个特定领域的开发」量身定制的。3hr28资讯网——每日最新资讯28at.com

比如,React作为一款针对「view开发」的DSL,虽然不同的view使用的框架不同,比如:3hr28资讯网——每日最新资讯28at.com

  • 对于web,框架为ReactDOM。
  • 对于小程序,框架为Taro。
  • 对于原生开发,字节内部有个叫React Lynx的框架。

但这些框架都大体遵循同一套DSL(React语法),这套DSL并不属于某一种编程范式,而应该被视为「不同编程范式中,更符合view开发的语言特性的集合」。3hr28资讯网——每日最新资讯28at.com

所以,作为React DSL的一部分,函数组件可以体现OOP的思想,类组件也能体现FP的思想。只要这些思想有利于「view开发」,就可以纳入DSL的语法中。3hr28资讯网——每日最新资讯28at.com

比如,下面的函数组件Header,是由WelcomeMessage与LogoutButton组件组合而成,这是OOP中的「组合优于继承」思想:3hr28资讯网——每日最新资讯28at.com

function Header(props) {  return (    <div>      <WelcomeMessage name={props.name} />      <LogoutButton onClick={props.onLogout} />    </div>  );}

再比如,下面的类组件Cpn中,要改变状态count,并不是通过突变(类似this.state.count++),而是调用this.setState,传入不可变数据:3hr28资讯网——每日最新资讯28at.com

class Cpn extends React.Component {  // ...  onClick() {    const count = this.state.count;    this.setState({count: count + 1});  }  render() {    // ...  }}

「使用不可变数据」属于FP中的思想。3hr28资讯网——每日最新资讯28at.com

所以,当我们要深入了解某个React特性时,应该以如下顺序递进的思考:3hr28资讯网——每日最新资讯28at.com

  • React的开发理念是什么?
  • 为了实现这套理念,吸收了哪些编程范式中的思想。
  • 这些思想如何在React中落地。

如果我们用上述思考过程研究「函数组件与函数式编程的关系」,会发现:3hr28资讯网——每日最新资讯28at.com

  • 函数组件属于落地的产物(上述思考的第三步)。
  • 函数式编程属于编程范式(上述思考的第二步)。

这就是两者的关系 —— 函数组件属于多种编程范式(主要是OOP与FP)在React中最终的落地产物,其中借鉴了一部分FP的思想。3hr28资讯网——每日最新资讯28at.com

我们不应该将函数组件单纯视为FP在React中的具象体现。3hr28资讯网——每日最新资讯28at.com

那么,函数组件究竟是如何演进而来的呢?3hr28资讯网——每日最新资讯28at.com

函数组件的演进

让我们按照上述三步演进顺序思考。首先,React的开发理念践行了如下公式(即:UI是数据快照经过函数映射而来):3hr28资讯网——每日最新资讯28at.com

UI = fn(snapshot)

要落地这个理念,有两个要素需要实现:3hr28资讯网——每日最新资讯28at.com

  • 数据快照
  • 函数映射

在这里,FP中「不可变数据」更适合作为「数据快照」的载体,所以React中状态是不可变的,因为状态的本质是快照。3hr28资讯网——每日最新资讯28at.com

而「函数映射」的载体则没有特殊要求。在React中,每次触发更新,所有组件都会重新render,render的过程就是「函数映射」的过程,输入是props与state,输出是JSX。3hr28资讯网——每日最新资讯28at.com

与React相对的,Vue中组件则更符合OOP的理念,考虑如下App组件:3hr28资讯网——每日最新资讯28at.com

const App = {  setup(initialProps) {    const count = reactive({count: 0})    const add = () => { count.value++ }    return {count, add}  }  template: "...省略"}

组件的setup方法只会在初始化时执行一次,后续触发更新时操作的都是同一个闭包中的数据。这里面的闭包就是OOP思想中的实例。3hr28资讯网——每日最新资讯28at.com

既然React对「函数映射」的载体没有特殊要求,那么类组件、函数组件都是可以的。3hr28资讯网——每日最新资讯28at.com

那为什么函数组件最终替代了类组件成为React开发的主流呢?很多同学认为「函数组件的Hooks可以更好的复用逻辑」这一点,是函数组件优于类组件的主要原因。3hr28资讯网——每日最新资讯28at.com

但实际上,基于装饰器的类开发模式早已被验证是优秀的逻辑复用模式,类组件配合TS装饰器的模式是行得通的。3hr28资讯网——每日最新资讯28at.com

主要原因还是 —— 函数组件能够更好的落地UI = fn(snapshot)这一理念。3hr28资讯网——每日最新资讯28at.com

刚才说过,公式中的snapshot是「快照」的含义。在React中,快照主要包括三类数据:3hr28资讯网——每日最新资讯28at.com

  • state
  • props
  • context

对于同一个组件,根据公式UI = fn(snapshot),相同的快照输入应该获得相同输出(JSX)。3hr28资讯网——每日最新资讯28at.com

但状态更新也可能触发「副作用」,比如请求数据、操作DOM...3hr28资讯网——每日最新资讯28at.com

在类组件中,这些「副作用」逻辑被分散在各个生命周期钩子函数中,React无法掌控。3hr28资讯网——每日最新资讯28at.com

而在函数组件中:3hr28资讯网——每日最新资讯28at.com

  • 副作用受限在useEffect中。每次render,React都会保证上次的副作用效果已经被清除(通过useEffect回调的返回值函数)
  • ref的传播也需要借由forwardRef,这进一步限制了ref可能的影响范围。
  • 数据请求的副作用被交给Suspense处理,考虑下面组件:
function UserList({id}) {  // 异步请求数据  const data = use(fetchUser(id));    // ...}

使用时:3hr28资讯网——每日最新资讯28at.com

<Suspense fallback={<div>加载中...</div>}>  <UserList id={1}/></Suspense>

总而言之,使用函数组件时,所有副作用都处于一种「受到管控」的状态,可以尽可能保证每次更新时「相同的快照输入,获得相同的JSX输出」,所以函数组件在React中才会发扬光大。3hr28资讯网——每日最新资讯28at.com

同时,这也契合了FP中的纯函数思想。3hr28资讯网——每日最新资讯28at.com

总结

「函数组件」并不是「函数式编程」在React中的具体实现,而是React的设计理念UI = fn(snapshot)落地的最好载体。3hr28资讯网——每日最新资讯28at.com

在React中,还吸收了其他编程范式中的优秀思想。FP只是其中影响React最深的一种。毕竟,一切落地都是为了践行最初的设计理念。3hr28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-32010-0.html函数组件和函数式编程有关系么?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Go 内存分配:结构体中的优化技巧

下一篇: 揭秘系列:Goroutine调度器

标签:
  • 热门焦点
  • K60 Pro官方停产 第三方瞬间涨价

    虽然没有官方宣布,但Redmi的一些高管也已经透露了,Redmi K60 Pro已经停产且不会补货,这一切都是为了即将到来的K60 Ultra铺路,属于厂家的正常操作。但有意思的是该机在停产之后
  • 7月安卓手机性能榜:红魔8S Pro再夺榜首

    7月份的手机市场风平浪静,除了红魔和努比亚带来了两款搭载骁龙8Gen2领先版处理器的新机之外,别的也想不到有什么新品了,这也正常,通常6月7月都是手机厂商修整的时间,进入8月份之
  • 6月安卓手机性价比榜:Note 12 Turbo断层式碾压

    6月份有一个618,虽然这是京东周年庆的日子,但别的电商也都不约而同的跟进了,反正促销没坏处,厂商和用户都能满意。618期间一些产品也出现了历史低价,那么各个价位段的产品性价比
  • 印度登月最关键一步!月船三号今晚进入环月轨道

    8月5日消息,据印度官方消息,月船三号将于北京时间今晚21时30分左右开始近月制动进入环月轨道。这是该探测器能够成功的最关键步骤之一,如果成功将开始围
  • 从 Pulsar Client 的原理到它的监控面板

    背景前段时间业务团队偶尔会碰到一些 Pulsar 使用的问题,比如消息阻塞不消费了、生产者消息发送缓慢等各种问题。虽然我们有个监控页面可以根据 topic 维度查看他的发送状态,
  • 年轻人的“职场羞耻感”,无处不在

    作者:冯晓亭 陶 淘 李 欣 张 琳 马舒叶来源:燃次元&ldquo;人在职场,应该选择什么样的着装?&rdquo;近日,在网络上,一个与着装相关的帖子引发关注,在该帖子里,一位在高级写字楼亚洲金
  • 2299元起!iQOO Pad开启预售:性能最强天玑平板

    5月23日,iQOO如期举行了新品发布会,除了首发安卓最强旗舰处理器的iQOO Neo8系列新机外,还在发布会上推出了旗下首款平板电脑——iQOO Pad,其搭载了天玑
  • 荣耀Magicbook V 14 2021曙光蓝版本正式开售,拥有触摸屏

    荣耀 Magicbook V 14 2021 曙光蓝版本正式开售,搭载 i7-11390H 处理器与 MX450 显卡,配备 16GB 内存与 512GB SSD,重 1.48kg,厚 14.5mm,具有 1.5mm 键盘键程、
  • 亲历马斯克血洗Twitter,硅谷的苦日子在后头

    文/刘哲铭  编辑/李薇  马斯克再次挥下裁员大刀。  美国时间11月14日,Twitter约4400名外包员工遭解雇,此次被解雇的员工的主要工作为内容审核等。此前,T
Top