当前位置: 首页 > 面试题库 >

何时使用基于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>
    );
}

我认为只要没有状态可以由该组件操纵,功能就可以了,是吗?

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


问题答案:

你有正确的主意。如果您的组件只做一些道具和渲染,那么功能就可以了。您可以将它们视为纯函数,因为在给定相同的道具的情况下,它们始终将呈现并表现相同的行为。而且,他们不在乎生命周期方法或拥有自己的内部状态。

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

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

编辑 :以上大部分是正确的,直到引入React Hooks。

  • componentDidUpdate可以使用复制useEffect(fn),其中fn在重新渲染时要运行的功能。

  • componentDidMount可以使用复制方法useEffect(fn, []),其中方法fn是在重新渲染时运行的函数,并且[]是(且仅当自上次渲染以来至少一个值已更改的情况)组件将针对其进行渲染的对象数组。由于没有useEffect(),因此在第一次安装时运行一次。

  • 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

关于何时在功能组件上使用类的建议,Facebook正式建议尽可能使用功能组件。顺便说一句,我听到很多人讨论出于性能原因不使用功能组件,特别是

“事件处理功能在功能组件中按渲染重新定义”

虽然正确,但请考虑您的组件是否真的以值得关注的速度或体积进行渲染。

如果是这样,则可以防止使用useCallbackuseMemo挂钩重新定义功能。但是,请记住,这可能会使您的代码(微观上)的性能变差。

但老实说,我从未听说过重新定义功能是React应用程序的瓶颈。过早的优化是万恶之源-遇到问题时请担心



 类似资料:
  • 在花了一些时间学习React之后,我理解了创建组件的两种主要模式之间的差异。 我的问题是什么时候我应该使用哪一个,为什么?一种方法与另一种方法相比有哪些好处/利弊? ES6类: 功能: 我认为只要没有状态可被该组件操纵,就可以正常工作,但就这样吗? 我想如果我使用任何生命周期方法,最好使用基于类的组件。

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

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

  • > 在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来说

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