【问题标题】:React-Router v4 separating Link and Route path elementsReact-Router v4 分离 Link 和 Route 路径元素
【发布时间】:2017-10-02 06:42:12
【问题描述】:

(为清晰起见已更新)我的应用具有以下结构:

<Layout />
  /components/
    <Header /> 
    <Navigation />
    <Stage />
    <Footer />
  /pages/
    <Home />
    <About />
    <Contact />

我的想法是隔离 &lt;Navigation&gt; 元素,并将其导入父 &lt;Header&gt;(以及后来的站点地图)。然后将所有组件暂存到父&lt;Layout&gt;,然后将其馈送到&lt;div id="root"&gt;

我的 /pages/ 组件的内容被成功调用并使用下面的代码呈现。但是,此页面内容呈现在我的 &lt;header&gt; 元素内,破坏了页面层次结构。

我的意图是让&lt;Switch&gt; 设备在&lt;Stage&gt; 父组件中呈现/pages/ 组件。

任何将&lt;Switch&gt; 元素移动到&lt;Stage&gt; 组件的尝试都会导致整个应用无法加载/渲染。

import React from 'react';

import {
  BrowserRouter as Router, Route, Link, Switch
} from 'react-router-dom';


import Home from './../pages/Home';
import About from './../pages/About';
import Contact from './../pages/Contact';

export default class Navigation extends React.Component {
  render() {
    return (
      <Router>
        <div className="navigation">

          <nav>
            <Link to="/">Home</Link>
            <Link to="/about">About</Link>
            <Link to="/contact">Contact</Link>
          </nav>

{/*
  Below should be repositioned outside of <header>, in Stage component
*/}
          <div className="stage">
            <Switch>
              <Route exact path="/" component={Home} />
              <Route path="/about" component={About} />
              <Route path="/contact" component={Contact} />
            </Switch>
          </div>

        </div>
      </Router>
    )
  }
}

我的问题是:当从&lt;Navigation&gt; 组件中选择时,如何让路由器在我的&lt;Stage&gt; 组件中呈现所需的/page/ 组件。

由于所有 reacttraining.com 示例都是单页的,我很难确定我在假设我的应用程序应该如何以最佳方式构建时是否犯了逻辑错误,或者是编程错误使用 react-router v4 重新创建两个元素之间的关系。

【问题讨论】:

  • 如果在打开舞台
    之前而不是之后关闭导航
    会发生什么?
  • 它会导致损坏,因为组件必须包装在单个元素中。
  • 因此,在舞台 div 之前关闭导航 div,然后将两者包装在一个新的单个 div 中应该可以工作。
  • 嗨@Drum。似乎我的问题需要澄清以更好地描述我的意图。请参阅上面的更新。

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


【解决方案1】:

您需要做的就是将这两个divs 分开,因为您将stage 包装在标题中。由于组件需要在单个元素中呈现,因此您需要在整个内容周围再添加一个 div

export default class Navigation extends React.Component {
  render() {
    return (
      <Router>
        <div>
          <div className="navigation">
            <nav>
              <Link to="/">Home</Link>
              <Link to="/about">About</Link>
              <Link to="/contact">Contact</Link>
            </nav>
          </div>

          <div className="stage">
            <Switch>
              <Route exact path="/" component={Home} />
              <Route path="/about" component={About} />
              <Route path="/contact" component={Contact} />
            </Switch>
          </div>
        </div>
      </Router>
    );
  }
}

更新: 更新我的答案:

import React from 'react';
import { render } from 'react-dom';
import { BrowserRouter as Router, Route, Link } from 'react-router-dom';

const Header = () => <h1>I'm a header</h1>;

const Navigation = () => (
  <nav>
    <Link to="/">Home</Link>
    <Link to="/about">About</Link>
    <Link to="/contact">Contact</Link>
  </nav>
);

const Stage = () => (
  <div>
    <Route exact path="/" component={Home} />
    <Route path="/about" component={About} />
    <Route path="/contact" component={Contact} />
  </div>
);

const Footer = () => <h6>Footer</h6>;

const Home = () => <h3>Home</h3>;
const About = () => <h3>About</h3>;
const Contact = () => <h3>Contact</h3>;

const App = () => (
  <Router>
    <div>
      <Header />
      <Navigation />
      <Stage />
      <Footer />
    </div>
  </Router>
);

render(<App />, document.getElementById('root'));

这是工作版本: https://codesandbox.io/s/v21BD37NX

【讨论】:

  • 这可以作为一种解决方案,但也许我应该提到我有 &lt;Navigation /&gt; 输入到 &lt;Header /&gt; 父组件。因此,上述建议仍会在我的&lt;header&gt; 中呈现&lt;div class="stage"&gt;。我的目标是将&lt;Switch /&gt; 组件完全隔离到我的父级/components/Stage.js 中的&lt;Layout /&gt;
  • 不确定我是否理解你想要做的事情,如果你能画出你想要实现的目标并一步一步解释我可能会提供帮助
  • 嗨@knowbody,我更新了我的问题,以便更清晰地定义我的意图。很高兴回答更多问题。
  • @DarrenBarklie 让我知道您是否是这个意思
  • 非常感谢@knowbody!我不知道为什么我这么卡在这上面。看到它清楚地展示了这一点,这帮助我克服了障碍。我已经想出将路由器隔离到它自己的导航组件并让一切正常工作。
猜你喜欢
相关资源
最近更新 更多
热门标签