【问题标题】:React make component more reusableReact 让组件更可重用
【发布时间】:2021-08-14 03:29:24
【问题描述】:

我为我的项目创建了一个页眉和样式,每个页面都将共享这些组件。

结构是:

<MuiThemeProvider theme={theme}>
    <div className="app-horizontal collapsed-sidebar">
        {/* SideBar Here */}
        <div className="app-container">
            <div className="rct-page-wrapper">
                <div className="rct-app-content">
                    <Header />
                </div>
                <div className="rct-page">
                    <HorizontalMenu />
                    <Scrollbars
                        className="rct-scroll"
                        autoHide
                        autoHideDuration={100}
                        style={getScrollBarStyle()}
                    >
                        <Content />
                    </Scrollbars>
                </div>
            </div>
        </div>
    </div>
</MuiThemeProvider>

基本上我有:

  • 包含标题组件的标题文件夹。带有 has 的主文件夹 Home.js 是代码所在,Content.js 是我渲染 Home 内容的地方 在&lt;div className="rct-page"&gt; 的内部&lt;Content /&gt;
  • Users 文件夹与 Home 相同,但将 &lt;Content /&gt; 更改为 用户的内容。
  • Properties 文件夹与 Home 相同,但正在更改 &lt;Content /&gt; 到 Properties` 内容
  • 等等。

如您所见,对于我的项目导航到的每个页面,我都在重复上面代码的相同结构,但更改了&lt;Content /&gt;。我认为这不是一个好方法。有没有办法让我的代码更可重用?

谢谢

【问题讨论】:

  • 查看 compositionthis thread 上的 React 文档。您可以将&lt;Content/&gt; 替换为props.children,并将标题组件包裹在您希望包含的任何其他组件周围。
  • @lawrence-witt 谢谢。你能给我举个例子吗?我所有的组件都在 Navigation.js 中,我在其中管理 &lt;Route exact path="/users" component={Users} /&gt; 等路由器。我如何将标题包装在用户组件中?
  • 您似乎已将标题组件和布局与页面组件和布局耦合。我强烈建议将标题与页面内容分离,因为这将允许您通过路由器在您想要的所有路由上呈现标题,并且页面可以独立匹配。

标签: reactjs


【解决方案1】:

我误读了您的示例代码,并认为它是标题组件本身。实际上,您可能需要的只是更改开关的位置。

如果您共享的示例对于应用程序的每个页面都完全相同,那么最好将其视为应用程序根:

<MuiThemeProvider theme={theme}>
    <div className="app-horizontal collapsed-sidebar">
        {/* SideBar Here */}
        <div className="app-container">
            <div className="rct-page-wrapper">
                <div className="rct-app-content">
                    <Header />
                </div>
                <div className="rct-page">
                    <HorizontalMenu />
                    <Scrollbars
                        className="rct-scroll"
                        autoHide
                        autoHideDuration={100}
                        style={getScrollBarStyle()}
                    >
                        <Switch>
                          <Route exact path="/" component={HomeContent}/>
                          <Route exact path="/users" component={UsersContent}/>
                          ...
                        </Switch>
                    </Scrollbars>
                </div>
            </div>
        </div>
    </div>
</MuiThemeProvider>

我不知道Navigation.js 在您的原始代码中做了什么。如果它是具有副作用或其他行为的组件,您不想污染根组件,则可以将其替换为上面的开关。

【讨论】:

  • 谢谢。你的第一个答案是完美的。我将所有MuiThemeProvider 移动到一个带有{props.children} 而不是&lt;Content /&gt; 的Main.js 组件。然后我在其他组件中将其称为&lt;Main&gt;&lt;h2&gt;EXAMPLE&lt;/h2&gt;&lt;/Main&gt;
猜你喜欢
  • 1970-01-01
  • 2021-10-01
  • 2020-10-02
  • 1970-01-01
  • 2020-10-13
  • 2015-01-03
  • 2017-02-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多