Структура компонента: замена одного компонента на основе пути реагирования-маршрутизатора

#reactjs #react-router

#reactjs #react-router

Вопрос:

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

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

У меня есть 2 вопроса:

1) Если я хочу поменять «СПИСОК ЭЛЕМЕНТОВ» на «ДОБАВИТЬ ФОРМУ ЭЛЕМЕНТА», когда пользователь нажимает «ДОБАВИТЬ ЭЛЕМЕНТ BTN» в правом верхнем углу, каков наилучший способ структурировать это?

У меня мог бы быть один маршрут, который загружает ListItemsPage компонент, а затем другой с помощью an AddItemPage , но оба они будут содержать много избыточного кода (в основном другие компоненты: элементы управления боковой панелью, список групп и т. Д.). Я предполагаю, что есть более простой способ справиться с подобными вещами. Или, возможно, я мог бы выполнить оператор if, который загружает либо список элементов, либо форму добавления элемента на основе текущего URL-адреса.

2) Какова наилучшая стратегия для перенаправления в группу по умолчанию? Если кто-то переходит в /group/7, мы загружаем список элементов группы 7. Однако, если кто-то перейдет в / group, я бы хотел по умолчанию использовать первую группу в списке групп, чтобы правая часть приложения никогда не была пустой.

Мои маршруты: (открыты для их изменения, если это будет иметь больше смысла)

 <Route path="/" component={App}> {/* should go to /group/1 */}
  <IndexRoute component={Home} />
  <Route path="/group/add" component={GroupAdd} />
  <Route path="/group/:id" component={GroupDetail} />
  <Route path="/group/:id/item/add" component={ItemAdd} />
  <Route path="/settings" component={Settings} />
</Route>
  

Ответ №1:

После небольшого копания в выходные я пришел к этому решению. Я не уверен, что это оптимально, но, похоже, в настоящее время он отлично работает для меня.

Надеюсь, это кому-то поможет: D

Маршрут:

 <Route path="/" component={App}>
  <IndexRedirect to="/group" />
  <Route path="group" component={GroupMain}>
    <Route path="add" component={GroupAdd} />
    <Route path=":groupId" component={GroupHome} />
    <Route path=":groupId/item">
      <Route path="add" component={ItemAdd} />
    </Route>
  </Route>
</Route>
  

Где я хочу, чтобы дочерние элементы появлялись в GroupMain:
(Где вы видите «СПИСОК ЭЛЕМЕНТОВ» в моем макете)

 {this.props.children ? React.cloneElement(this.props.children, { propsYouWantToPassToChildren }) : ''}
  

Затем для обработки перенаправления на идентификатор по умолчанию в GroupMain

 componentWillReceiveProps(nextProps) {
  const { dispatch, groups, selectedGroup, params } = nextProps;
  const { groupId } = params;

  // The URL does not match the state. Update state.
  if (typeof groupId !== 'undefined' amp;amp; (selectedGroup !== groupId || selectedGroup.length === 0)) {
    dispatch(selectGroup(groupId));
    return;
  }

  // No selectedGroup and No groupId in URL. Update state.
  if (typeof groupId === 'undefined' amp;amp; selectedGroup.length === 0 amp;amp; Object.keys(groups).length > 0) {
    const newSelectedGroup = Object.keys(groups)[0];
    dispatch(selectGroup(newSelectedGroup));
    this.context.router.push(`/group/${newSelectedGroup}`);
  }
}