如何在主页中嵌套React Routes

时间:2016-07-08 23:37:06

标签: reactjs react-router

我试图弄清楚如何在主页内正确嵌套路线。这是我的路由器:

var appRouter = (
  <Router history={ hashHistory }>
    <Route path="/" component={ Navbar }>
      <IndexRoute component={ Homepage }/>
      <Route path="items" component={ Homepage }>
        <Route path=":item" component={ ItemShow }/>
      </Route>
      <Route path="nothome" component={ NotHome }/>
    </Route>
  </Router>
)

拥有指向主页的IndexRoute和Route并不是最佳的,但它给了我正在寻找的行为。这是我的整个项目(我写这篇文章只是为了说明这一点)。

//React
var React = require("react");
var ReactDOM = require("react-dom");
//Router
var ReactRouter = require('react-router')
var Router = ReactRouter.Router
var Route = ReactRouter.Route
var IndexRoute = ReactRouter.IndexRoute
var hashHistory = ReactRouter.hashHistory
var Link = ReactRouter.Link

var items = [1, 2]

var Navbar = React.createClass({
  render(){
    return(
      <div>
        <Link to="/"><h1>Navbar</h1></Link>
        {this.props.children}
      </div>
    )
  }
})

var Homepage = React.createClass({
  render(){
    return(
      <div>
        <h2>This is the homepage</h2>
        <ItemList/>
        <Link to="/nothome">Another page</Link>
        {this.props.children}
      </div>
    )
  }
})

var ItemList = React.createClass({
  render(){
    return(
      <ul>
        {items.map( item => {
          return <Item key={item} id={item}></Item>
        })}
      </ul>
    )
  }
})

var Item = React.createClass({
  handleClick(){
    hashHistory.push("items/" + this.props.id)
  },
  render(){
    return(
      <li onClick={this.handleClick}>Item {this.props.id}</li>
    )
  }
})

var ItemShow = React.createClass({
  render(){
    return(
      <div>
        You clicked on item {this.props.params.item}
      </div>
    )
  }
})

var NotHome = React.createClass({
  render(){
    return(
      <h2>This is not the homepage</h2>
    )
  }
})

var appRouter = (
  <Router history={ hashHistory }>
    <Route path="/" component={ Navbar }>
      <IndexRoute component={ Homepage }/>
      <Route path="items" component={ Homepage }>
        <Route path=":item" component={ ItemShow }/>
      </Route>
      <Route path="nothome" component={ NotHome }/>
    </Route>
  </Router>
)

document.addEventListener("DOMContentLoaded", ()=>{
  ReactDOM.render(appRouter, document.getElementById("root"))
})

React Routes Nested In Homepage

另一个选择是将一个主页组件放在我的ItemShow组件的顶部,而不是嵌套路由,但是如果不是更糟的话,这似乎也是坏的。

似乎必须有一种更好的方法来获得这种行为。它是什么?

1 个答案:

答案 0 :(得分:1)

寻找你的代码,似乎你真的不需要这个“items”路由,因为“/”和“/ items”都呈现相同的组件(<Homepage>)。

因此,如果您想避免使用两个“Homepage”声明,只要他们转到“/”,您就可以将用户重定向到“项目”。您可以使用<IndexRedirect><Redirect>onEnter挂钩来完成此操作。

有关该钩子的更多信息:

https://github.com/reactjs/react-router/blob/v2.5.2/docs/guides/IndexRoutes.md#index-redirects

如果您真的希望能够访问指向相同组件的那两条路线,那么您可能不必更改任何内容。但是,在你的情况下,我会有一个“主页”(即使有一些虚拟信息)和一个“项目主页”,它将避免重复“主页”。

BTW,就像提示一样,我会将您的<NavBar>重命名为“<App>”或类似的内容,因为了解您的代码会更好!