【问题标题】:Compose React app based on the value of a flag根据标志的值编写 React 应用程序
【发布时间】:2019-03-14 03:20:44
【问题描述】:

问题陈述:

我想编写我的 react 应用程序,以根据标志的值使用一组特定的组件。

例如:

我有一个默认由三个组件组成的 App 组件:

组件A、组件B和组件C。

<App> 
    <ComponentA />
    <ComponentB />
    <ComponentC />
<App/>

现在,如果我的标志等于 ShowC,我希望我的应用程序渲染 ComponentA、ComponentB 和 ComponentC。

如果标志等于 ShowD,那么我想要渲染 ComponentD 而不是 ComponentC。

<App> 
    <ComponentA />
    <ComponentB />
    <ComponentD />
<App/>

解决办法:

我使用了一个配置对象,该对象将相应的导入作为键值对:

{
    showC: {
        pos1: ComponentA,
        pos2: ComponentB,
        pos3: ComponentC,
    },
    showD: {
        pos1: ComponentA,
        pos2: ComponentB,
        pos3: ComponentD,
    }
}

现在,在我的主 App.js 中:

render() {
    const {
        pos1: FirstComponent,
        pos2: SecondComponent,
        pos3: ThirdComponent
    } = config[<flag>];

    <App>
        <FirstComponent />
        <SecondComponent />
        <ThirdComponent />
    </App>
}

我在 stackblitz 上创建了一个简单的示例来说明这一点。

https://stackblitz.com/edit/react-app-components-config?file=index.js

我想了解以这种方式组合组件是否被视为 React 中的反模式?或者是否有更好的解决方案?

【问题讨论】:

    标签: reactjs components composition


    【解决方案1】:

    您可以创建一个 HOC,它会根据标志决定渲染什么

    const DynamicComponent = ({type,children}) => (
    
      { // you can have any condition here.
        type === 'a'?
        children[0]:
        children[1]
      }
    
    )
    

    // 你的主要组件

    render() {
    
        <App>
            <FirstComponent />
            <SecondComponent />
            <DynamicComponent type={config.type}> 
               <ThirdComponent />
               <FourthComponent />
            </DynamicComponent>
        </App>
    }
    

    您应该始终尝试为任何此类组合创建一个新的 HOC,它遵循函数式编程组合模式。

    【讨论】:

    • 感谢您的回答!例如,这是我正在开发的大型应用程序的简化版本。在该应用程序中,我希望能够自定义/覆盖属于我的主 的任何组件,而不仅仅是最后一个组件。因此,使用这种模式,我需要将所有组件包装在一个 HOC 中。不确定如果基于我驱动逻辑的标志具有 4/5 的可能值而不是 2,那将是多么可扩展。
    • 我会建议一个 HOC 并将所有配置传递给该 HOC,并根据您的逻辑并呈现您想要的内容。为什么 HOC 很有用,因为您可以将组件作为道具传递。您可以在 HOC 中使用任何自定义逻辑。如果逻辑很复杂,请使用类组件来简化事情。您真的不想在根目录中拥有复杂的逻辑。您需要根据您的要求制作多个 HOC 并进行渲染。 @Pranita
    猜你喜欢
    • 1970-01-01
    • 2020-11-25
    • 1970-01-01
    • 2021-02-16
    • 1970-01-01
    • 1970-01-01
    • 2016-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多