【问题标题】:React router 4 render same component for all routesReact 路由器 4 为所有路由渲染相同的组件
【发布时间】:2018-04-26 23:47:44
【问题描述】:

所以这个问题更多是关于我应该采取什么方法来解决这个问题。

我有一个这样的 JSON

const app = [
  {
    tab: 'Home',
    // content: '<div>This is home</div>',
    nav: [
      {
        tab: 'Dashboard',
        content: '<div>This is Dashboard</div>'
      },
      {
        tab: 'Profile',
        content: '<div>This is Profile</div>'
      },
    ]
  },
  {
    tab: 'About',
    content: '<div>This is About</div>'
  },
  {
    tab: 'Pricing',
    content: '<div>This is Pricing</div>'
  },
];

现在我想要的是设置整个路由和页面来呈现上述 JSON。

下面是伪代码:

方法 1...

循环并为每个导航/子导航添加路线。

import {
  BrowserRouter,
  Route,
  NavLink,
} from 'react-router-dom';


const Page = (content) => {
  return (
    <div>{content}</div>
  )
}

<BrowserRouter>
  app.map((nav, i) =>
    <NavLink key={nav.tab} to={`/${nav.tab}`} activeClassName="active">
      {nav.tab}
    </NavLink>
    <Route
      path={`/${nav.tab}`} render={(props) => (
        <Page {...props} pageData={nav.content}>
          if(nav.subNav) {
            nav.subNav.map((subnav, i) =>
              <NavLink key={subnav.tab} to={`/${nav.tab}/${subnav.tab}`} activeClassName="active">
                {nav.tab}
              </NavLink>
              <Route
                path={`/${nav.tab}/${subnav.tab}`} render={(props) => (
                  <Page {...props} pageData={subnav.content} />
                )}
              />
            )          
          }
        </Page>
      )}
    />
  )
</BrowserRouter>

方法 2

这样的事情会更好/更好吗?只需 2 个路由返回相同的组件,将 app 对象传递给 Page,然后根据 URL 渲染相应的数据

const Page = (app) => {
  return (
    // Loop over app
    if(mainNav from URL == tab) {
      if(subNav from URL == tab) {
        <div>{content}</div>
      }
    }

  )
}

<BrowserRouter>
  <Route
    path={'/:mainNav'} render={(props) => (
      <Page {...props} pageData={app} />
    )}
  />
  <Route
    path={'/:mainNav/:subNav'} render={(props) => (
      <Page {...props} pageData={app} />
    )}
  />
</BrowserRouter>

感谢您的通读并感谢您的帮助。如果还有其他更好的方法,我很想知道!

【问题讨论】:

  • 你解决了吗?我有完全相同的“问题”。
  • 所以我所做的是......让我的所有路线都呈现相同的组件 并且所有导航信息都作为道具传递,在 内基于道具显示.... 有道理吗?
  • 是的!这说得通。我想以同样的方式做,但我想知道这是否是一个好的模式嘿嘿。我可能会将您的解决方案与 HOC 结合起来。谢谢!!

标签: javascript reactjs navigation react-router-v4 react-router-dom


【解决方案1】:

尝试利用您的&lt;Route /&gt; 组件中提供的exact prop

&lt;Route exact path="/foo" component={Foo} /&gt;

如果你有路线:

  • /foo
  • /foo/bar
  • /foo/bar/baz

/foo 匹配所有三种情况。

【讨论】:

  • 你会建议哪种方法?
  • exact 作为道具添加到您的&lt;Route .. /&gt; 组件,&lt;Route exact .. /&gt;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
  • 2023-03-06
  • 2019-04-25
  • 1970-01-01
  • 1970-01-01
  • 2021-09-10
  • 2022-10-23
相关资源
最近更新 更多