我试图弄清楚如何在主页内正确嵌套路线。这是我的路由器:
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"))
})
另一个选择是将一个主页组件放在我的ItemShow组件的顶部,而不是嵌套路由,但是如果不是更糟的话,这似乎也是坏的。
似乎必须有一种更好的方法来获得这种行为。它是什么?
答案 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>
”或类似的内容,因为了解您的代码会更好!