【问题标题】:Functional Components inside class components类组件中的功能组件
【发布时间】:2019-05-08 11:37:04
【问题描述】:

目前我有一个类组件,其中包含在我的 JSX 中充当组件的函数。

例子:

class MyComponent extends React.Component {
    MySubComponent = (props) => {
        if (props.display) {
            return <p>This text is displayed</p>
        }
    }

    render() {
        return (
            <this.MySubComponent display={true} />
        )
    }
}

以这种方式调用组件有什么影响吗?还有这个术语吗?

【问题讨论】:

  • 只有在该功能组件内使用this 时才会有此好处。否则不需要动态创建它。请注意,由于您使用的是属性初始化器语法,因此将为基于类的组件的每个实例重新创建功能组件。
  • 这是什么原因?如果没有,则说明您编写的代码比您所能编写的更复杂。
  • @estus 我希望渲染函数保持声明性。因此,我将所有渲染逻辑移至函数,以避免将它们包含在渲染函数本身中。我知道我可以轻松地调用像 {this.mySubComponent()} 这样的函数,但 imo 将其保留为 JSX 使其更易于阅读。
  • 我明白了。根据 KISS 原则,此时 MySubComponent 不需要成为 MyComponent 的一部分。组件可以单独使用和测试。
  • @estus 我通常会同意,但是这个组件只会被这个类使用。它实际上只是一个类函数,只是它的显示方式存在争议。

标签: javascript reactjs components this react-props


【解决方案1】:

这会导致为每个 MyComponent 实例创建新的 MySubComponent 函数,这不是很有效的方法。

MySubComponent 用作MyComponent 方法可能只有两个好处。

其中之一是MySubComponent 可以替换为MyComponent 子类中的另一个实现,而无需修改render 函数。这对 React 来说不是惯用的,因为它提倡函数式方法而不是 OOP。

另一个是MySubComponent 可以访问MyComponent 实例及其属性。这会导致设计问题,因为两个组件紧密耦合。

这些论点在 React 开发中都不是实质性的。除非有特定需求要求MySubComponent 成为MyComponent 的一部分,否则不应将前者定义为后者的实例方法。可能只是:

const MySubComponent = (props) => {
    if (props.display) {
        return <p>This text is displayed</p>
    }
}

class MyComponent extends React.Component {
    render() {
        return (
            <MySubComponent display={true} />
        )
    }
}

【讨论】:

  • 应该紧耦合的情况呢?例如,如果我们没有这个函数/组件,render 方法看起来像这样 render() { return ( {true &&

    This text is display

    } ) } 不是声明性的。
  • 似乎只有两种选择:1. 使渲染函数成为命令式或 2. 创建一堆外部功能组件以确保渲染方法保持声明性。方法2也像您所说的那样有效,这似乎违反直觉,因为该组件只是为了使核心组件“更干净”,因此在我看来,将其放在类之外并没有多大意义
  • 你是什么情况?通过紧密耦合,我的意思是 MySubComponent 可以使用父组件实例,例如this.state,这将是一个设计错误。 '2' 是它通常在 React 中完成的方式。我会说 OOP 范式对你不利。你不需要把你能做的所有事情都放在一个类中,只是为了指定一个项目“属于”它,这是反模式。类不是美化的命名空间。已经有模块作为命名空间工作。我是适合 OOP 的支持者,但在这一点上,它的使用根本不合理。
  • 你说得很好,但我还有一个问题支持 OOP 方法。 {this.MySubComponent()} 与 有什么不同吗?如果有,为什么?
  • 直接调用更快,因为它跳过了 React 元素抽象,基本上是 React.createElement 调用及其渲染。 React 渲染器以任何方式在内部调用函数。 React 元素足够快,不会成为瓶颈。
猜你喜欢
  • 2020-09-03
  • 2020-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
  • 2021-01-30
  • 2020-09-28
相关资源
最近更新 更多