React:何时使用基于ES6类的组件与功能ES6组件?

Jor*_*rix 169 javascript ecmascript-6 reactjs redux

花了一些时间学习React后,我理解了创建组件的两个主要范例之间的区别

我的问题是我什么时候应该使用哪一个?为什么?一个在另一个上有什么好处/权衡?

ES6/7课程:


import React, { Component } from 'react';

export class MyComponent extends Component {
  render() {
    return (
      <div></div>
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

功能:


const MyComponent = (props) => {
    return (
      <div></div>
    );
}
Run Code Online (Sandbox Code Playgroud)

只要没有任何状态可以被该组件操纵,我就会想到功能......但是这样吗?

我猜我是否使用任何生命周期方法,最好使用基于类的组件.

小智 119

你有正确的想法.如果您的组件除了接受一些道具和渲染之外没有其他功能,那么请继续使用.您可以将它们视为纯函数,因为它们将始终呈现并表现相同,给定相同的道具.此外,他们不关心生命周期方法或有自己的内部状态.

因为它们是轻量级的,所以将这些简单的组件编写为功能组件是非常标准的.

如果您的组件需要更多功能,例如保持状态,请改用类.

更多信息:https://facebook.github.io/react/docs/reusable-components.html#es6-classes

  • 从React 16.8开始,您可以通过useState钩子在功能组件中使用状态。 (4认同)
  • FB 的推荐似乎随着时间的推移而改变:在 [2016 年 6 月](https://web.archive.org/web/20160608001717/http://facebook.github.io/react/docs/reusable-components.html),他们推荐了功能组件,在[2016年10月](https://web.archive.org/web/20161019074256/https://facebook.github.io/react/docs/reusable-components.html)他们推荐了功能组件当你不需要状态时,ES6类当你需要时以及在[2016年11月](https://web.archive.org/web/20161103110003/https://facebook.github.io/react/docs/components -and-props.html),他们的建议被完全删除。 (4认同)
  • 您在哪里可以找到“Facebook 官方建议尽可能使用功能组件”的信息? (3认同)

ffx*_*sam 36

始终尽可能尝试使用无状态功能(功能组件).在某些情况下,您需要使用常规的React类:

  • 组件需要维护状态
  • 该组件重新渲染太多,您需要控制该通道 shouldComponentUpdate
  • 你需要一个容器组件

UPDATE

现在有一个名为React的类PureComponent,你可以扩展(而不是Component)实现自己的类shouldComponentUpdate,为你处理浅道具比较.阅读更多

  • `总是尝试尽可能使用无状态功能(功能组件).我读过十个人都这么说.他们仍然没有给出解释原因. (35认同)
  • `在理想情况下,大多数组件都是无状态函数,因为将来我们还可以通过避免不必要的检查和内存分配来对这些组件进行性能优化.这是推荐的模式,如果可能的话.更多信息:https://facebook.github.io/react/docs/reusable-components.html#stateless-functions (23认同)
  • @rotareti我不知道你是否觉得你的问题得到了回答,但纯函数更容易理解,测试和维护.给定相同的参数,它们总是呈现相同的东西.在生命周期事件发生时维护状态和更改的组件更难理解.并不是说它们有时不需要它们,但我希望很明显,如果不需要它们的优点,它们所做的就是添加不需要的样板和开销而没有任何好处. (2认同)

Gal*_*puf 29

功能组件不比基于类的组件更轻量级,"它们与类完全相同." - https://github.com/facebook/react/issues/5677

上面的链接有点过时,但React 16.7.0的文档说明功能和类组件:

"与React的观点相同." - https://reactjs.org/docs/components-and-props.html#stateless-functions

除了语法之外,功能组件和仅实现render方法的类组件之间基本上没有区别.

在将来(引用上面的链接)"我们[React]可能会添加这样的优化."

如果您试图通过消除不必要的渲染来提高性能,则这两种方法都会提供支持.memo用于功能组件和PureComponent类.

- https://reactjs.org/docs/react-api.html#reactmemo

- https://reactjs.org/docs/react-api.html#reactpurecomponent

这完全取决于你.如果你想要更少的样板,那就去功能吧.如果你喜欢函数式编程而不喜欢类,那就去实用吧.如果您想要代码库中所有组件之间的一致性,请使用类.如果您厌倦了在需要类似功能时从功能到基于类的组件进行重构state,请使用类.

2019年1月更新

随着React钩子的引入,似乎React团队希望我们尽可能使用功能组件(这更好地遵循JavaScript的功能性质).这有助于您编写更简单的组件,重用有状态逻辑,并摆脱类周围的所有icky(如memo).

  • 我认为让每个组件都扩展 React.Component 会使代码更具可读性,尤其是对于新手而言。当您看到每次都以相同的方式创建组件时,真是太好了。就像@Galupuf 所说的,简单的组件只有一种叫做“render()”的方法。让所有东西都扩展 React.Component 也很好,因为当你想开始绑定“this”、拥有状态等时,你不必重构所有东西,你可以添加你需要的东西。 (2认同)

Kar*_*rim 23

从 React 17 开始,无状态功能组件这个术语具有误导性,应该避免(React.SFC 已弃用Dan Abramov 在 React.SFC 上),它们可以有状态,也可以有钩子(充当生命周期方法),它们或多或少地与类组件重叠

基于类的组件

功能组件:

为什么我更喜欢函数式组件

  • React 提供了 useEffect 钩子,这是一种非常清晰简洁的方式来组合componentDidMount,componentDidUpdatecomponentWillUnmount生命周期方法
  • 使用钩子,您可以提取可以在组件之间轻松共享可测试的逻辑
  • 减少对范围界定的混淆

反应动机为什么使用钩子(即功能组件)。