Как определить IndexRoute реагирующего маршрутизатора при использовании динамической маршрутизации
Что у меня есть root route
определение:
const rootRoute = {
childRoutes: [{
path: '/',
component: require('./screens/Container'),
appGlobalVars: appGlobalVars,
childRoutes: [
require('./routes/ListApps'),
require('./routes/Settings'),
require('./routes/Profile')
]
}]
};
var runApp = (appGlobalVars) => {
var routes = (
<Provider store={store}>
<Router history={ history } routes={rootRoute} />
</Provider>
);
render(routes, document.getElementById('app'));
};
и некоторые настройки с вложенной динамической маршрутизацией:
./routes/Settings/index.js:
module.exports = {
path: 'settings',
getComponent(nextState, cb) {
require.ensure([], (require) => {
cb(null, require('../../screens/AppSettings'))
})
},
getChildRoutes(partialNextState, cb) {
require.ensure([], (require) => {
cb(null, [
require('./General'),
require('./Users')
])
})
},
};
/settings
это родительский компонент, который делает {this.props.children}
реагировать роутер проходит. Например, если я перейду к /settings/general
у меня будет settings
отрендерено, что в свою очередь отрендерит general
как его ребенок:
./routes/Settings/General.js
module.exports = {
path: 'general',
getComponent(nextState, cb) {
require.ensure([], (require) => {
cb(null, require('../../screens/AppSettings/General'))
})
}
};
Это нормально, но я бы хотел определить дочерний компонент по умолчанию Settings
должен отображаться при переходе к /settings
,
Короче говоря: есть ли способ определить что-то вроде IndexRoute
при использовании динамической маршрутизации?
2 ответа
Вы должны использовать getIndexRoute
- https://github.com/reactjs/react-router/blob/master/docs/API.md#getindexroutepartialnextstate-callback
Поскольку метод getIndexRoutes устарел, я заметил, что indexRoute ожидает объект { component: SomeCompoent }, который является схемой объекта, возвращаемого getComponent, поэтому я использовал getComponent для предоставления indexRoute следующим образом:
export default (store) => ({
path : 'shops',
childRoutes: [
EditShopRoute(store),
],
component: EntityLayout, // this renders always
indexRoute: { // this renders only when route matches exactly /shops
getComponent (nextState, cb) {
require.ensure([], (require) => {
const Shops = require('./containers/ShopsContainer').default
const reducerShop = require('./modules/shops').default
injectReducer(store, { key: 'shops', reducer: reducerShop })
cb(null, Shops)
/* Webpack named bundle */
}, 'shops')
} }
})