美文网首页前端共享Web前端之路让前端飞
React 中被忽略的函数组件(Functional Compo

React 中被忽略的函数组件(Functional Compo

作者: 艾特老干部 | 来源:发表于2017-07-16 08:16 被阅读744次

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渲染,理想情况下,所有的组件都是展示性组件,每个页面都是由这些展示性组件组合而成。如果一个组件是函数组件,那么它当然满足这个要求。所以牢记函数组件的概念,可以让你在写组件时,先思考这个组件应不应该是展示性组件。更多的展示性组件意味着更多的组件有更简洁的结构,更多的组件能被更好的复用。

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


欢迎关注我的公众号:老干部的大前端,领取21本大前端精选书籍!

image

相关文章

网友评论

  • 开发者头条_程序员必装的App:感谢分享!已推荐到《开发者头条》:https://toutiao.io/posts/q7wr8r 欢迎点赞支持!
    欢迎订阅《xuchaobei的大前端》https://toutiao.io/subjects/11003
  • f5d349c4db3b:错了,Functional Components要少用才对,除非系统非常简单,只做数据展示,或者一开始就规划好没有太多数据交互,不然后面会非常蛋疼的改到Class Components。个人经验之谈
    42bddd8bb2c5:@苍山沭河 使用FC,考验的是函数式编程的理解以及对自己将要写的代码的极致追求,所以要求是很高的。为了效率,在能够使用FC的地方先使用,最后在重构代码时,再去拆分提取。另外,可以在写代码前,先列个提纲,react本来就是积木组合,所以一个好的提纲,有利于组件的拆分。
    李简书:https://facebook.github.io/react/blog/2015/10/07/react-v0.14.html
    Stateless functional components is designed to encourage the creation of these simple components that should comprise large portions of your apps. In the future, we’ll also be able to make performance optimizations specific to these components by avoiding unnecessary checks and memory allocations.
    艾特老干部: @JNotNull 之所以推荐用函数组件,就是希望在设计组件时能尽量简单,多做些思考,如果一个组件设计时确定就是无状态组件,基于文中的比较,那么我们为什么不能使用函数组件呢?用函数组件,无关乎系统的复杂度,越复杂的系统,越应该在设计组件前多思考,哪些是方便复用的无状态组件,而时刻牢记函数组件的概念,能迫使我们多做这方面的思考。

本文标题:React 中被忽略的函数组件(Functional Compo

本文链接:https://www.haomeiwen.com/subject/pqktkxtx.html