2016-04-19 3 views
1

Глядя на пример huge-apps на github response-router, я не уверен, как настроить маршруты, которые я хочу.Реактивный маршрутизатор с вложенными детьми?

URL  | Result 
-------------------------- 
/sites  | List of sites 
/sites/:id | One site 

Если я хочу перечислить несколько сайтов, компонент/маршрут сайта должен быть вложен в компонент/маршрут Сайты. Таким образом, моя структура папок будет похожа на модель Assignments в примере action-router.

/routes 
    /Sites 
     /components 
     | Sites.js 
     /routes 
     | /Site 
     | | /components 
     | | | Site.js 
     | | index.js 
     index.js 

Однако для /sites/:id маршрута, он не зависит от компонента Sites. Смогу ли я создать еще один каталог сайта на том же уровне в каталоге «Сайты», или я могу заставить компонент сайта отображать список и уникальный вид? Как выглядят мои файлы index.js?

ответ

3

Я бы визуализировать маршрут дерева таким образом:

/sites 
(Sites.js) 
- /:id1 
    (Site1.js) 
- /:id2 
    (Site2.js) 

Внутри вашего index.js, что-то вроде этого (с использованием на стороне клиента пример):

render((
    <Router history={browserHistory}> 
    <Route path="/" component={App}> 
     <IndexRoute component={Home} /> 
     <Route path="/sites" component={Sites}> 
     <Route path="/sites/:id" component={Site}/> 
     </Route> 
    </Route> 
    </Router> 
), document.getElementById('app')); 

Каждый маршрут имеет сопроводительный компонент. Вы можете выбросить все, что захотите, в эти компоненты, хотя, вероятно, было бы полезно включить какой-то способ навигации по дочерним маршрутам.

PlainRoute версия (хотя я не уверен, почему вы хотите):

const rootRoute = { 
    component: 'div', 
    childRoutes: [{ 
    path: '/', 
    component: require('./components/App'), 
    childRoutes: [ require('./routes/Sites') ] 
    }] 
} 

render(
    <Router history={browserHistory} routes={rootRoute} />, 
    document.getElementById('example') 
); 

'./routes/Sites ':

module.exports = { 
    path: 'sites', 
    getChildRoutes(location, cb) { 
    require.ensure([], (require) => cb(null, [ require('./routes/Site') ])) 
    }, 
    getComponent(nextState, cb) { 
    require.ensure([], (require) => cb(null, require('./components/Sites'))) 
    } 
} 

' ./routes/Site' :

module.exports = { 
    path: 'sites/:id', 
    getComponent(nextState, cb) { 
    require.ensure([], (require) => cb(null, require('./components/Site'))) 
    } 
} 
+0

Как вы это сделаете с помощью PlainRoutes, как это работает? – GreeKatrina

+0

Я не знаю, почему вы хотите использовать PlainRoutes, когда JSX более эффективен с точки зрения удобочитаемости. Я добавлю к своему первоначальному ответу свою лучшую попытку в версии PlainRoutes, согласно файловой структуре, используемой в примере. –

+0

Как вы видите [здесь] (https://github.com/reactjs/react-router/blob/master/examples/huge-apps/app.js), это лучше для разделения кода.В любом случае, спасибо заранее. – GreeKatrina

1

Если я правильно понял, что вы пытаетесь достичь, вы могли бы сделать что-то вроде этого в маршрутизаторе:

<Route path="/sites/:id" component={SingleSite} /> 
<Route path="/sites" component={Sites} /> 

Если SingleSite компонент принимает параметры идентификатора и использует его для отображения сайта. React router должен иметь возможность использовать компонент SingleSite, если есть идентификатор, и показать компонент Sites, если нет.

+0

Можете ли вы просто передать опору компоненту сайта компонентом Сайта, когда он отображает/создает каждый сайт? – GreeKatrina

+0

Я полагаю, это зависит от того, хотите ли вы, чтобы компонент «Site» отображался как дочерний элемент компонента «Сайты» или нет. Я думаю, что, поскольку вы не хотели бы показывать как список, так и отдельный сайт одновременно, было бы лучше сделать их братьями и сестрами под родителем, у которого есть объект со всеми сайтами. «Сайты» будут перебирать этот объект и отображать все, и «Сайт» получит ': id' в параметре prop of response router, а затем отфильтрует пропущенную пропущенную от родителя. –

+0

это имеет смысл. Я полагаю, что наличие как одного компонента делает его более похожим на модель в MVC, чем компонентом. Нужно ли сначала поставить более глубокий путь? Например, если '/ sites /: id' после того, как маршрут'/sites' заставляет '/ sites /: id' никогда не отображаться? – GreeKatrina

Смежные вопросы