【React】后台开发学前端 04 - React组件02 - 函数组件

上一章: 【React】后台开发学前端 04 - React组件01 - JSX, 类组件

前言

用单独一个篇幅来介绍React所推荐的函数式组件,是因为在版本16以后,有了hooks函数后,函数组件完全可以替代类组件做任何事情。而且写法优雅,并且强调一下,是React推荐的方式。

虽然这种Javascript里面的function的写法对后端开发来说很不友好。而且相比较来说类组件做起来更面向对象, 对于后端开发更容易理解一些。但是自从我接触了函数式组件依赖,我渐渐喜欢上了这种简单明了的写法。介绍函数组件之前,先说说它和类组件的大致区别:

区别函数组件类式组件
是否有 this没有
是否有生命周期没有
是否有状态 state没有
编写形式函数形式类形式

所以说函数式组件是静态组件。是一个三无产品(没有this没有生命周期没有state) 

而我们说过,类组件被称作动态组件。(有所有支持其能够动态的因子)

静态函数组件

抛开支持其“动起来”的那些个东西,其实写一个静态的函数组件他其实特别的简单

export default function App() {
  return (
    <>
      <h1>Hello, World!</h1>
      <ul>
        <li>first</li>
        <li>second</li>
        <li>thrid</li>
      </ul>
      <button key='123'>Button</button>
    </>
  );
}

看看上面,这是一个叫做App的组件,他由“export default”来导出,便于其他组件import使用。

他是一个函数式组件。里面有一个return,包含了一个标题,一套列表和一个按钮。

特别注意的是,他的返回跟类组件返回一样,要求只能是一个节点,所以要嘛就用一个<div>标签作为输出单节点标签, 要嘛就用我上图的<></>的空标签来包住要返回的多标签来返回。

最后渲染到页面的如下:

 具体聊聊函数和类组件的区别

这个话题真的对我们后端开发学习前端来说挺重要的。为什么放着根后台java相似的类组件不用,就要去用函数主键来搞。

其实在React16以前,函数组件真的不被看好的。因为就一个只能写静态页面的主键,除了那些动不了的页面,只用作纯展示的页面,单反遇到一个可以互动的页面,可以动态渲染的页面,函数组件都没有用武之地。但是在React16以后,引入了一个爆炸式的东西,就是各种Hooks函数,配合这些Hooks函数用函数式组件编程不要太爽。(Hooks的学习我们放在后面)

我们来了了为什么有了类组件,React还要推行函数组件,首先抛开hooks函数对函数组件的影响我们来具体的分析class和function组件两者区别:

  • class组件是有状态的组件,可以定义state状态。函数组件是无状态的。
  • class组件有生命周期。函数组件没有生命周期,函数组件使用的是Hooks。
  • class组件是有this对象的。函数组件没有this对象。
  • 组件调用:class组件实例化后调用render方式调用。函数组件是直接调用的。
  • class组件内部render方法return返回渲染jsx模板。函数组件直接返回即可。
  • ref获取子组件的对象。class组件可以直接获取到,函数组件无法直接获取到。
  • 绑定bind改变this指向,只适用于class组件。

根据上面的区别,然后我们来谈谈为什么React要推行函数组件,首先来说是优雅,但是fb团队花那么大的力气,拽着整个React社区往一个前所未有的方向前进,原因肯定不仅仅是“写法更优雅”。真正的原因可能如下面描述:

  1. Hooks是比HOC和render props更优雅的逻辑复用方式。这个是很多人喊“真香”的原因。优雅的逻辑复用方式,会促进一个更加蓬勃的生态,这对于原本生态就很强的React来说是如虎添翼。会有更多的人愿意把自己的逻辑抽离成hooks(因为真的太优雅了),发布为library,为react生态添砖加瓦(看看这段时间各种基于hooks的状态管理工具)。我还认为,很快会出现一些“hooks生态圈”的“lodash”。
  2. 函数式组件的心智模型更加“声明式”。hooks(主要是useEffect)取代了生命周期的概念(减少API),让开发者的代码更加“声明化”:
  • 旧的思维:“我在这个生命周期要检查props.A和state.B(props和state),如果改变的话就触发xxx副作用”。这种思维在后续修改逻辑的时候很容易漏掉检查项,造成bug。
  • 新的思维:“我的组件有xxx这个副作用,这个副作用依赖的数据是props.A和state.B”。从过去的命令式转变成了声明式编程。
  • 其实仔细想一想,人们过去使用生命周期不就是为了判断执行副作用的时机吗?现在hooks直接给你一个声明副作用的API,使得生命周期变成了一个“底层概念”,无需开发者考虑。开发者工作在更高的抽象层次上了。
  • 类似的道理,除了声明副作用的API,react还提供了声明“密集计算”的API(useMemo),取代了过去“在生命周期做dirty检查,将计算结果缓存在state里”的做法。React内核帮你维护缓存,你只需要声明数据的计算逻辑以及数据的依赖。

    3. 函数式组件的心智模型更加“函数式”。为未来的并发模式打下基础。(其实react从一开始就受到了很多函数式编程的影响,现在推行函数式组件算是“回归初心”)。

以上介绍出处如下,感谢作者分享!

作者:csr632
链接:https://www.zhihu.com/question/343314784/answer/937174224

    4. 逻辑复用, 具体参考下面引用

链接: 为什么 React 现在要推行函数式组件,用 class 不好吗? - 知乎

下一章: 【React】后台开发学前端 05 - React props & state 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值