功能组件( Functional Component )与类组件( Class Component )如何选择?

简介: 功能组件( Functional Component )与类组件( Class Component )如何选择?

如果您的组件具有状态( state ) 或 生命周期方法,请使用 Class 组件。否则,使用功能组件

解析:

React中有两种组件:函数组件(Functional Components) 和类组件(Class Components)。据我观察,大部分同学都习惯于用类组件,而很少会主动写函数组件,包括我自己也是这样。但实际上,在使用场景和功能实现上,这两类组件是有很大区别的。

来看一个函数组件的例子:

function Welcome = (props) => {
  const sayHi = () => {
    alert( `Hi ${props.name}` );
  }
  return (
    <div>
      <h1>Hello, {props.name}</h1>
      <button onClick ={sayHi}>Say Hi</button>
    </div>
  )
}

把上面的函数组件改写成类组件:

import React from 'react'
 
class Welcome extends React.Component {
  constructor(props) {
    super(props);
    this.sayHi = this.sayHi.bind(this);
  }
  sayHi() {
    alert( `Hi ${this.props.name}` );
  }
  render() {
    return (
      <div>
        <h1>Hello, {this.props.name}</h1>
        <button onClick ={this.sayHi}>Say Hi</button>
      </div>
    )
  }
}

下面让我们来分析一下两种实现的区别:

1.第一眼直观的区别是,函数组件的代码量比类组件要少一些,所以函数组件比类组件更加简洁。千万不要小看这一点,对于我们追求极致的程序员来说,这依然是不可忽视的。

2.函数组件看似只是一个返回值是DOM结构的函数,其实它的背后是无状态组件(Stateless Components)的思想。函数组件中,你无法使用State,也无法使用组件的生命周期方法,这就决定了函数组件都是展示性组件(Presentational Components),接收Props,渲染DOM,而不关注其他逻辑。

3.函数组件中没有this。所以你再也不需要考虑this带来的烦恼。而在类组件中,你依然要记得绑定this这个琐碎的事情。如示例中的sayHi。

4.函数组件更容易理解。当你看到一个函数组件时,你就知道它的功能只是接收属性,渲染页面,它不执行与UI无关的逻辑处理,它只是一个纯函数。而不用在意它返回的DOM结构有多复杂。

5.性能。目前React还是会把函数组件在内部转换成类组件,所以使用函数组件和使用类组件在性能上并无大的差异。但是,React官方已承诺,未来将会优化函数组件的性能,因为函数组件不需要考虑组件状态和组件生命周期方法中的各种比较校验,所以有很大的性能提升空间。

6.函数组件迫使你思考最佳实践。这是最重要的一点。组件的主要职责是UI渲染,理想情况下,所有的组件都是展示性组件,每个页面都是由这些展示性组件组合而成。如果一个组件是函数组件,那么它当然满足这个要求。所以牢记函数组件的概念,可以让你在写组件时,先思考这个组件应不应该是展示性组件。更多的展示性组件意味着更多的组件有更简洁的结构,更多的组件能被更好的复用。

所以,当你下次在动手写组件时,一定不要忽略了函数组件,应该尽可能多地使用函数组件。

相关文章
|
7月前
|
XML 前端开发 数据格式
使用 class sap.ui.core.UIComponent.createContent 创建 Component 实例
使用 class sap.ui.core.UIComponent.createContent 创建 Component 实例
27 0
|
7月前
|
缓存
关于 Spartacus ProdutList Component Service model$ 的填充逻辑
关于 Spartacus ProdutList Component Service model$ 的填充逻辑
31 0
|
5天前
|
前端开发 开发者
类组件(Class component)和 函数式组件(Functional component) 之间有何区别?
类组件(Class component)和 函数式组件(Functional component) 之间有何区别?
40 0
|
4天前
|
开发者 容器
Spartacus 里动态创建 Injector 的例子
Spartacus 里动态创建 Injector 的例子
11 1
|
7月前
|
缓存 JavaScript
75Vue - 使用 v-once 的低级静态组件(Cheap Static Component)
75Vue - 使用 v-once 的低级静态组件(Cheap Static Component)
15 0
|
6月前
|
前端开发 JavaScript
写文章 类组件(Class component)和 函数式组件(Functional component)之间有何区别
写文章 类组件(Class component)和 函数式组件(Functional component)之间有何区别
23 0
|
8月前
|
资源调度
SAP 电商云 Spartacus UI Component 级别的延迟加载实现(Lazy Load)
SAP 电商云 Spartacus UI Component 级别的延迟加载实现(Lazy Load)
38 0
|
Dart API
Dart中Class、mixin、interface三者间关系及异同
Dart中Class、mixin、interface三者间关系及异同
|
JavaScript 前端开发
React之Class类组件的生命周期
React之Class类组件的生命周期
136 0
React之Class类组件的生命周期
动态组件<component :is=‘‘></component>
动态组件<component :is=‘‘></component>