开发者问题收集

无法让 React-Router 渲染两个不同的组件,始终渲染根组件

2016-12-02
1071

我有这两个完全独立的组件。我想在输入 / 时呈现 App ,在转到 /#/about 时呈现 About

我得到了这段代码(但我测试了不少其他代码):

import React from 'react';
import ReactDOM from 'react-dom';
import { Router, Route, Link, browserHistory } from 'react-router'
import App from './App';
import About from './About';

ReactDOM.render(
  <Router history={browserHistory}>
    <Route path="/" component={App} >
      <Route path="/about" component={About} />
    </Route>
  </Router>
  , document.getElementById('root')
);

我也尝试了类似

<Route path="/about" component={About} />
<Route path="/" component={App} />

并将 /about 更改为 /#/aboutabout

但它总是呈现“后备” / ,无论如何它总是走这条路线。

我如何让此应用正确导航到 //about 并呈现 AppAbout 组件?

@edit

假设我的 About 组件损坏,我删除了第一个 Route 并仅保留了 /about (仅保留了 /about 路由):

<Route path="/about" component={App} />

(我在之前的测试中也尝试保留 About)并将 /about 更改为 about/#/about

我在控制台上收到此错误:

"VM3651 bundle.js:30801 Warning: [react-router] Location "/#/about" did not match any routes"

@edit 2

我按照 @Dominic 发布的示例进行了更改。我必须进行一些修改以确保两个组件都能呈现。我将 {this.props.children} 添加到所有组件以了解会发生什么。

//imports
ReactDOM.render(
<Router history={browserHistory}>
  <Route path="/" component={About} >
    <IndexRoute component={App} />
    <Route path="/about" component={Other} />
  </Route>
</Router>
,document.getElementById('root'));

路由 http://localhost:3000/#/about 正在呈现:

> About > App

因此它正在呈现 IndexRoute,它没有被 /about 捕获。

而这正是我现在所需要的,因为我不想要根组件,我想要 2 个路由到 2 个不同且独立的组件。我需要类似两个兄弟路线的东西。

@edit

About.js

import React, { Component } from 'react';

class About extends Component {
  render() {
    return (
      <div>
        About page
        {this.props.children}
      </div>
    );
  }
}

export default About;

解决方案:

由于我在 URL 中使用了 HASH (#),因此我应该在 <Router history={hashHistory}>

中使用 React Router 中的 hashHistory
2个回答

您对路线的工作方式感到困惑 - AboutApp 路线的子路线,因此为了呈现 About ,它必须呈现 App

换句话说,您的 App 组件是“外壳”,其下的所有组件都在其内部渲染(通过 props.children )。

您应该添加另一条路由来渲染 /

import { ..., IndexRoute } from 'react-router'

<Route path="/" component={App} >
  <IndexRoute component={Home} />
  <Route path="about" component={About} />
</Route>

您的 App 不包含路由特定的内容,它应该是这样的:

<div id="app">
  <nav>app navigation</nav>
  <main class="route-content">{props.children}</main>
</div>

文档: https://github.com/ReactTraining/react-router/blob/master/docs/guides/RouteConfiguration.md#adding-an-index

nanobar
2016-12-02

这些路线在我看来是正确的。你在控制台中收到任何错误吗?也许你的 About 组件未定义,因此无法渲染。你可以发布你的 About 组件吗?

Tim McIntire
2016-12-02