Подтвердить что ты не робот

Как реализовать динамическую маршрутизацию в route.js для сгенерированных пунктов меню на боковой панели в универсальной схеме редукции для сокращения от erikras

В настоящее время я работаю над проектом на основе CMS.

Для чего я использую универсальный реактивный редукционный шаблон erikras

Мне действительно нужны предложения по обработке динамической маршрутизации

Давайте рассмотрим простой сценарий с шаблоном...

В routes.js

<Route path="about" component={About}/>
<Route path="login" component={Login}/>
<Route path="survey" component={Survey}/>
<Route path="widgets" component={Widgets}/>

data.js

export const data = [
  {id: 1, property: 'Dashboard', link: '/'},
  {id: 2, property: 'Login', link: '/login'},
  {id: 3, property: 'About Us', link: '/About'},
];

теперь, скажем, на основе роли пользователя, свойства в json-данных будут меняться

скажем, новое свойство:

{id: 4, property: 'test page', link: '/test'}

Когда реакция будет отображать компоненты, как она будет знать ссылку маршрута.. поскольку она не определена в route.js

Я не получаю правильный способ его реализации

Нам нужна боковая панель, состоящая из определенного содержимого меню в соответствии с ролью пользователя.

Скажем, мы строим систему бронирования, могут быть разные роли пользователя, такие как admin, режим обслуживания, роль помощника .

Таким образом, у другой роли будут разные свойства, соответственно нам нужно создать меню на основе его, так как свойства будут определенно отличаться в зависимости от роли пользователя.

Спасибо!!

4b9b3361

Ответ 1

Из вашего примера неясно, какой компонент должен отображаться для /test url? Я полагаю, что это значение ключа property, правильно?

Первая опция

Вы можете сделать что-то вроде этого:

<Route path="/:page" component={Page}/>

Это позволит вам отображать компонент Page для каждого URL-адреса, который начинается с /, и этот компонент будет иметь URL-адрес страницы внутри this.props.routeParams.page. Он позволяет найти необходимый компонент внутри Page#render:

render() {
  const url = this.props.routeParams.page;
  const PageComponent = data.find(page => page.link === url).property;
  render <PageComponent />;
}

Вторая опция

Вы можете генерировать маршруты динамически, но я не уверен, что он работает (вы можете проверить его). Вы просто должны заменить эту часть:

<Route path="about" component={About}/>
<Route path="login" component={Login}/>
<Route path="survey" component={Survey}/>
<Route path="widgets" component={Widgets}/>

с

 data.map(page => <Route path={page.link} component={page.property} key={page.id}/>)

Ответ 2

Третий вариант:

Следуйте за примером-маршрутизатором "огромные приложения" для динамической загрузки маршрутов.

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

|____Calendar
| |____components
| | |____Calendar.js
| |____index.js
|____Course
| |____components
| | |____Course.js
| | |____Dashboard.js
| | |____Nav.js
| |____index.js
| |____routes
| | |____Announcements
| | | |____components
| | | | |____Announcements.js
| | | | |____Sidebar.js
| | | |____index.js
| | | |____routes
| | | | |____Announcement
| | | | | |____components
| | | | | | |____Announcement.js
| | | | | |____index.js
| | |____Assignments
| | | |____components
| | | | |____Assignments.js
| | | | |____Sidebar.js
| | | |____index.js
| | | |____routes
| | | | |____Assignment
| | | | | |____components
| | | | | | |____Assignment.js
| | | | | |____index.js
| | |____Grades
| | | |____components
| | | | |____Grades.js
| | | |____index.js
|____Grades
| |____components
| | |____Grades.js
| |____index.js
|____Messages
| |____components
| | |____Messages.js
| |____index.js
|____Profile
| |____components
| | |____Profile.js
| |____index.js

`` ` Репо больше не включает этот пример в мастер-ветку.