Я пытаюсь выяснить, как правильно размещать маршруты внутри главной страницы. Вот мой маршрутизатор:Как вставить React Routes на домашнюю страницу
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 и маршрут, что и точка на главную страницу не кажется оптимальным, но это дает мне поведение я ищу. Вот мой весь проект (я написал это, чтобы проиллюстрировать этот момент).
//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 компонента, а не гнездо маршрутов, но кажется, что так же плохо, если не хуже.
Кажется, что должен быть предпочтительный способ получить это поведение. Что это?
Спасибо! Я на самом деле изначально назвал приложение верхнего уровня, и кто-то рекомендовал переместить мой индексный контент там, поэтому я решил изменить имя на Navbar, по иронии судьбы, для ясности. Моя цель, безусловно, НЕ иметь два маршрута, указывающих на один и тот же компонент, именно этого я и стараюсь избегать. Я просто хочу, чтобы пользователь мог посетить домашнюю страницу и добавить материал на эту домашнюю страницу. Я думал о простое перенаправление в контроллере Rails, но я решил, что должен быть способ сделать это более красиво с помощью React. Похоже, IndexRedirect - это путь! –
Имеет ли IndexRedirect то же самое, что и IndexRoute с точки зрения заполнения {this.props.children} его родительского компонента? –
@WylliamJudd no, Redirect и IndexRedirect также не заполняют 'this.props.children', они просто« перемещают »вашего пользователя на другой маршрут, и этот маршрут заполняет это. –