当前位置: 首页 > 知识库问答 >
问题:

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

壤驷承
2023-03-14

在花了一些时间学习React之后,我理解了创建组件的两种主要模式之间的差异。

我的问题是什么时候我应该使用哪一个,为什么?一种方法与另一种方法相比有哪些好处/利弊?

ES6类:

import React, { Component } from 'react';

export class MyComponent extends Component {
  render() {
    return (
      <div></div>
    );
  }
}

功能:

const MyComponent = (props) => {
    return (
      <div></div>
    );
}

我认为只要没有状态可被该组件操纵,就可以正常工作,但就这样吗?

我想如果我使用任何生命周期方法,最好使用基于类的组件。

共有3个答案

常甫
2023-03-14

尽可能使用无状态函数(功能组件)。在某些情况下,您需要使用常规React类:

  • 组件需要保持状态
  • 组件重新渲染过多,您需要通过shouldComponentUpdate
  • 您需要一个容器组件

现在有一个名为PureComponent的React类,您可以扩展它(而不是Component),它实现自己的shouldComponentUpdate,为您提供浅层的道具比较。阅读更多

孟昆
2023-03-14

2019年3月更新

根据我最初的答复所述:

“反应函数和类之间有什么根本的区别吗?当然,在心智模型中有。”

https://overreacted.io/how-are-function-components-different-from-classes/

2019年2月更新:

随着React钩子的引入,React团队似乎希望我们尽可能使用功能组件(这更符合JavaScript的功能性质)。

他们的动机:

1.) It’s hard to reuse stateful logic between components
2.) Complex components become hard to understand
3.) Classes confuse both people and machines

带钩子的函数组件几乎可以做类组件可以做的所有事情,而不需要上面提到的任何回拉。

我建议尽快使用它们。

原始答案

功能组件并不比基于类的组件更轻量级,“它们完全像类一样执行。”-https://github.com/facebook/react/issues/5677#issuecomment-241190513

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

“从React的角度来看,是等效的。”-https://reactjs.org/docs/components-and-props.html#stateless-功能

除了语法之外,函数组件和仅仅实现呈现方法的类组件之间基本上没有区别。

将来(引用上面的链接)“我们[反应]可能会添加这样的优化。”

如果您试图通过消除不必要的呈现来提升性能,两种方法都提供支持。

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

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

这真的取决于你。如果你想要更少的样板,那就去功能化。如果你喜欢函数式编程而不喜欢类,那就去函数式编程吧。如果您想要代码库中所有组件之间的一致性,请使用类。如果您厌倦了在需要类似于state的东西时将功能组件重构为基于类的组件,那么就使用类。

梁丘烨
2023-03-14

你的想法是对的。如果你的组件只需要一些道具和渲染,那么就使用functional。您可以将这些函数视为纯函数,因为在相同的道具下,它们的渲染和行为总是相同的。而且,他们不关心生命周期方法,也不关心自己的内部状态。

因为它们是轻量级的,所以将这些简单组件作为功能组件编写是相当标准的。

如果你的组件需要更多的功能,比如保持状态,使用类来代替。

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

编辑:在React钩子的引入之前,上述大部分都是正确的。

>

方法可以通过使用使用效果(fn, [])复制,其中fn是在重新渲染时运行的函数,并且[]是组件将重新渲染的对象数组,如果和仅当自上次渲染以来至少有一个值已更改时。因为没有,所以在第一次挂载时运行一次。

state可以使用useState()进行复制,其返回值可以分解为状态引用和可以设置状态的函数(即const[state,setState]=useState(initState))。举个例子可以更清楚地解释这一点:

const Counter = () => {
  const [count, setCount] = useState(0)

  const increment = () => { 
    setCount(count + 1);
  }

  return (
    <div>
      <p>Count: {count}</p>
      <button onClick={increment}>+</button>
    </div>
  )
}

default export Counter

作为一个小插曲,我听到很多人讨论了出于性能原因而不使用功能组件,特别是

尽管如此,请考虑您的组件是否真的以这样的速度或音量渲染,这将是值得关注的。

如果是,您可以使用useCallbackusemo钩子阻止重新定义函数。但是,请记住,这可能会使您的代码(从微观上)性能更差。

但老实说,我从未听说过重新定义功能会成为React应用程序的瓶颈。过早的优化是所有邪恶的根源——当它成为问题时,请担心

 类似资料:
  • 问题内容: 在花了一些时间学习React之后,我了解了创建组件的两个主要范例之间的区别。 我的问题是,什么时候应该使用哪个?为什么?一个人相对于另一个人的利益/取舍是什么? ES6课程: 功能性: 我认为只要没有状态可以由该组件操纵,功能就可以了,是吗? 我猜如果我使用任何生命周期方法,最好使用基于类的组件。 问题答案: 你有正确的主意。如果您的组件只做一些道具和渲染,那么功能就可以了。您可以将它

  • 我知道在香草ES6中,您可以编写一个,它扩展了一个函数类。这里解释了这一点。 React支持两个ES6类组件,通过扩展React。组件和功能组件。但是,当尝试扩展功能组件时,我遇到了以下错误。 我正在尝试编写一些扩展组件的代码,这些代码同时适用于ES6类组件和功能组件。我想写一个函数,返回一个组件,但不是一个高阶组件,我只想扩展和修改一些道具。 下面是一些我尝试过但不起作用的示例代码。这可能吗?我

  • 问题内容: 我是 React的 新手,我想清楚地知道要使用哪一种,关于组件,我看到有两种类型。 功能组件: 基于类的组件: 我读到我们应该始终尝试使用 功能性组件, 因为它在某些方面有所帮助,并且还听说我们应该尽可能避免使用基于 类的组件 。 我很困惑哪个是对的,哪个不是。 为什么要尽可能使用功能组件,这样做有什么好处? 我们何时应该选择功能组件,何时不应该,尚不清楚。 问题答案: 类组件 基于类

  • 我是一个新手,我总是想到一个基于类的组件,就像我在Java中做类一样。 在Java中比较基于类的组件和类的两种思维是正确的吗?换句话说,呈现的组件是否像Java中的对象一样,它们是类的实例化? 有区别吗?

  • > 在ES6中直接初始化类上的属性是不可能的,目前只能用这种方式声明方法。同样的规则也存在于ES7中。 https://stackoverflow.com/a/38269333/4942980 render方法中的一个函数将在每个呈现中创建,这对性能有一点影响。如果你把它们放在渲染图中也很乱 ...更喜欢只将专门处理呈现组件和/或JSX的函数放在render中(即,在prop上进行映射,根据pro

  • 问题内容: 这是ES6问题的一部分,React问题。我正在尝试在带有ES6类和Babel的React中使用命名空间组件。因此,我想真正的问题是如何命名空间es6类,以便执行此处说明的操作:https ://facebook.github.io/react/docs/jsx-in- depth.html#namespaced-components 由于出现意外的令牌错误: 问题答案: 对于ES6来说