【发布时间】:2020-06-06 01:22:38
【问题描述】:
我需要为我的 React 函数组件的 ALL 添加添加 [data-test-id] 属性以进行测试的可能性。为了实现这一点,我创建了 withTestId() HOC,它将可选的 prop testId 添加到包装的组件中,并在定义后将 [data-test-id] 添加到最终的 HTML 中。
所以当我定义像这样的组件时:
<ExampleComponent testId="example" />
它返回:
<div data-test-id="example" />
我唯一的问题是将其应用于每个组件,而无需将其单独包装在每个组件中。所以不要写这样的代码:
function ExampleComponent() { ... }
export default withTestId(ExampleComponent)
我想将我的所有导出文件都包含在我的 index.ts 文件中,现在看起来像这样:
export { default as ExampleComponent } from "./ExampleComponent";
export { default as ExampleComponent2 } from "./ExampleComponent2";
...
我怎样才能做到这一点?
【问题讨论】:
-
如果你想在任何地方都使用 HoC,我不确定它是否适合。
-
那你还有什么推荐的?
-
默认情况下数据属性已经是有效的 props,为什么不只是
<TestComponent data-test-id="123" />并确保使用<div {...props}>将未知的 props 应用于每个组件的根元素?不再需要 HoC,它适用于您想要应用于组件的任何内容。虽然这是一个risky pattern,但取决于您管理道具的程度。我个人经常使用它,但我也在组件树的所有不同级别过滤掉任何不需要的道具。 -
如果你有 props 类型验证,当无意的额外 props 被传递时你会收到警告或错误,所以
jsx-props-no-spreading可以安全地禁用。它仍然可能会影响可维护性,但会大大减少样板文件、树深度(每个 HoC 都会增加)、改进 tree-shaking(导出所有内容的索引会大大削弱 tree-shaking),并且总体上会降低复杂性因为与导出代码生成等相比,传播是一种常见模式。 -
我想我会使用这种方法。你是对的,当我进行类型验证时使用它是安全的。当然,这条规则有它的优点和缺点,但我开始认为禁用它比让它打开有更多积极的方面。
标签: javascript reactjs ecmascript-6 components es6-modules