【问题标题】:React HOC and accessing propsReact HOC 和访问道具
【发布时间】:2021-04-12 11:46:59
【问题描述】:

我正在尝试理解下面的 React HOC;

const withSecretToLife = (WrappedComponent) => {
  class HOC extends React.Component {
    render() {
      return (
        <WrappedComponent
          {...this.props}
          secretToLife={42}
        />
      );
    }
  }
    
  return HOC;
};

export default withSecretToLife;

下面是另一个组件;

import withSecretToLife from 'components/withSecretToLife';

const DisplayTheSecret = props => (
  <div>
    The secret to life is {props.secretToLife}.
  </div>
);

const WrappedComponent = withSecretToLife(DisplayTheSecret);

export default WrappedComponent;

特别是我想了解

  1. 如果它是“DisplayTheSecret”,它可以访问道具“secretToLife”或 WrappedComponent?看待这个 HOC 的正确方法是什么?
  2. “const WrappedComponent = withSecretToLife(DisplayTheSecret);”这一行在“const DisplayTheSecret = props => ()”行之后。这是一个标准模式吗?重要吗?
  3. 与上述问题相关,我们如何才能在我们拥有“props.secretToLife”之前 声明/定义。对于 WrappedComponent 即 const WrappedComponent = withSecretToLife(DisplayTheSecret);
  4. 在上述情况下,App.js 中实际消耗/使用的内容,即 &lt;WrappedComponent /&gt;&lt;DisplayTheSecret /&gt; 或其中任何一个都可以使用?

【问题讨论】:

    标签: javascript reactjs higher-order-functions higher-order-components


    【解决方案1】:
    1. 您创建了一个新组件 - WrappedComponent。它得到了道具 secretToLifeDisplayTheSecret 本身没有 secretToLife 属性。

    2. 在一般实践中,您应该使用已经存在的变量 定义如上。所以 DisplayTheSecret 应该定义在它的上面 用法。但是,您可以随心所欲地使用它,因为变量和函数会自动提升到作用域的顶部。

    3. 您可以这样做,但可能会导致运行时出错。如果 你决定使用DisplayTheSecret 组件而不包装它 与HOCTypescript 通过生成类型来解决这些问题 在开发过程中。

    4. WrappedComponentDisplayTheSecretHOC组成。

    【讨论】:

      【解决方案2】:

      DisplayTheSecret 是一个简单的组件,它希望在其属性中找到secretToLife

      withSecretToLife 是一个接受WrappedComponent 并返回另一个组件的函数(我们称之为WrappingHOC

      WrappingHOC 返回 WrappedComponent 传递给 withSecretToLife,传递它自己的所有 props 并添加一个新的 - secretToLife

      const WrappedComponent = withSecretToLife(DisplayTheSecret);——这个也叫WrappedComponent,但和上面的WrappedComponent(传递给函数的那个​​)不一样,是WrappingHOCDisplayTheSecret我们叫ResultingComponent

      所以:

      1. secretToLife 是由ResultingComponent 传递给DisplayTheSecret 的属性

      2. 顺序很重要,在开始使用之前声明一个函数总是一个好主意

      3. secretToLife是一个普通属性,你在创建组件时声明它

      4. DisplayTheSecret 没有被导出,所以不能在模块外使用,除了可以不包装使用

      【讨论】:

      • 非常感谢...是的,依此类推 (4),因为我们在 DisplayTheSecret 中指的是“props.secretToLife”,所以我们似乎总是期待道具“secretToLife”,这意味着它将始终通过 ResultingComponent (或 WrappedComponent 根据我的代码)而不是直接作为 DisplayTheSecret 调用/引用。那是正确的吗?这也是为什么我们故意“不”导出 DisplayTheSecret,而是导出 ResultingComponent(或 WrappedComponent)所以,本质上这个组件将始终被使用/消耗,比如在 App.js 中,作为 而不是
      • 没有理由不能导出 DisplayTheSecret 并在创建组件时提供属性,例如 。只有当您有许多不同的组件需要 secretToLife 并且您知道您需要经常提供它们 42 时,您示例中的 HOC 才会有用
      • 好吧,很酷......所以本质上,在这种情况下,HOC 函数“withSecretToLife”的目的似乎是提供道具“secretToLife”,并且这个道具可以提供给任何 XYZ 组件可能需要它......我们唯一要做的就是用 withSecretToLife 包装这个基础/XYZ 组件,结果组件(即增强的 XYZ 组件)可以只引用“props.secretToLife”(这个道具将来自 HOC)
      • 同样就出口而言,有点不清楚。所以正如你提到的,没有什么能阻止我们做 (假设这只能在我们导出 DisplayTheSecret 时完成)......但是,出于实际目的,在使用 HOC 时,似乎常见的模式是导出结果组件而不是基础组件,我们不需要将 secretToLife 传递为。 ...只需执行 也应该给出正确的道具值为 secretToLife。
      • Yoy 是正确的。在实践中,一个组件被拆分为一个 HOC 并包装了部分以重用功能(比如从数据库中获取相同的数据以两种不同的方式呈现它,一个 HOC 和两个从 HOC 获取此数据的组件)并且它很少使感觉导出所有单独的部分。
      猜你喜欢
      • 2020-01-16
      • 1970-01-01
      • 2020-02-05
      • 2020-05-04
      • 2018-12-21
      • 1970-01-01
      • 2018-10-10
      • 2018-10-13
      • 2018-02-15
      相关资源
      最近更新 更多