在花了一些时间学习React之后,我明白了创建组件的两种主要范式之间的区别。
我的问题是什么时候应该使用哪个,为什么?其中一种与另一种相比有什么好处/权衡?
ES6签署:
import React, { Component } from 'react';
export class MyComponent extends Component {
render() {
return (
<div></div>
);
}
}
功能:
const MyComponent = (props) => {
return (
<div></div>
);
}
我认为函数是指没有状态可以被那个组件操纵的情况,但真的是这样吗?
我想,如果我使用任何生命周期方法,最好使用基于类的组件。
2023年1月更新
TLDR;函数是创建组件的最佳方式。反应。组件是一个遗留API。
“我们建议将组件定义为函数而不是类。”
React仍然支持类组件,但我们不建议在新代码中使用它们。”
https://beta.reactjs.org/reference/react/Component
2019年3月更新
在我最初回答的基础上:
React函数和React函数之间有什么根本区别吗
还上课吗?当然,在心智模型中。
https://overreacted.io/how-are-function-components-different-from-classes/
2019年2月更新:
随着React钩子的引入,React团队似乎希望我们尽可能使用函数式组件(这更好地遵循了JavaScript的函数式本质)。
他们的动机:
很难在组件之间重用有状态逻辑。
复杂的组件变得难以理解。
课程让人和机器都感到困惑。
带有钩子的功能组件几乎可以做类组件可以做的所有事情,没有上面提到的任何缺点。
我建议你尽快使用它们。
原来的答案
功能组件并不比基于类的组件更轻量级,“它们完全像类一样执行。”——https://github.com/facebook/react/issues/5677 # issuecomment - 241190513
上面的链接有点过时,但React 16.7.0的文档说
函数组件和类组件:
从React的角度来看是等价的吗
https://reactjs.org/docs/components-and-props.html#stateless-functions
功能组件和只实现呈现方法的类组件本质上没有区别,只是语法不同。
今后(引用上述链接):
我们React可能会添加这样的优化
如果您试图通过消除不必要的渲染来提高性能,这两种方法都可以提供支持。功能组件的memo和类的PureComponent。
https://reactjs.org/docs/react-api.html#reactmemo
https://reactjs.org/docs/react-api.html#reactpurecomponent
这完全取决于你。如果你想要更少的样板文件,那就使用功能。如果你喜欢函数式编程,不喜欢类,那就选择函数式编程。如果您希望代码库中的所有组件保持一致,请使用类。如果您厌倦了在需要状态之类的东西时将函数组件重构为基于类的组件,那么就使用类。
在React 17中,术语无状态功能组件是误导性的,应该避免使用。SFC已弃用,Dan Abramov在React.SFC上),它们可以有状态,也可以有钩子(充当生命周期方法),它们或多或少与类组件重叠
基于类的组件
状态
生命周期方法
用React记忆。PureComponent
功能组件:
state (useState, useReducer钩子)
生命周期方法(通过useEffect, useLayoutEffect钩子)
通过备忘录HOC进行记忆
为什么我更喜欢功能性组件
React提供了useEffect钩子,这是一种非常清晰和简洁的方式来组合componentDidMount, componentDidUpdate和componentWillUnmount生命周期方法
使用钩子,您可以提取可以在组件之间轻松共享和可测试的逻辑
减少对范围的混淆
React动机为什么使用钩子(即功能组件)。