Как организовать маршрутизацию для страниц, находящихся внутри других страниц?

Какой лучший способ настроить роутинг для сайдбара с выпадающими вложенными страницами, где на каждой странице нужно подтягивать одинаковый контент с помощью API?
  • 21 января 2024 г. 13:29
Ответы на вопрос 2
Организация маршрутизации для страниц, находящихся внутри других страниц, также известная как вложенная маршрутизация, может быть выполнена с использованием библиотек маршрутизации, таких как React Router (для React), Vue Router (для Vue.js) или Angular Router (для Angular).

Для примера, давайте рассмотрим вложенную маршрутизацию, используя React Router (версии 5.x):

1. Создайте родительский маршрут, который будет оберткой для ваших вложенных маршрутов.

```jsx
<Route path="/parent" component={ParentComponent} />
```

2. Внутри вашего `ParentComponent`, используйте `<Switch>` и `<Route>` для определения вложенных маршрутов.

```jsx
import { Switch, Route, useRouteMatch } from 'react-router-dom';

function ParentComponent() {
  let { path, url } = useRouteMatch();

  return (
    <div>
      {/* Здесь мог бы быть ваш сайдбар и прочее */}
      <Switch>
        <Route exact path={path}>
          {/* Показать что-то, когда пользователь в /parent */}
        </Route>
        <Route path={`${path}/child1`}>
          <Child1 />
        </Route>
        <Route path={`${path}/child2`}>
          <Child2 />
        </Route>
      </Switch>
    </div>
  );
}
```

3. Если вам нужно загружать одинаковый контент с API для всех страниц, сделайте вызов API в родительском компоненте и передайте данные через props в дочерние компоненты, либо используйте глобальное управление состоянием с помощью таких библиотек, как Redux или Context API.

```jsx
function ParentComponent() {
  let { path } = useRouteMatch();
  let [data, setData] = useState(null);

  useEffect(() => {
    // Функция для вызова API и получения данных
    fetchDataFromAPI().then(data => setData(data));
  }, []);

  return (
    <div>
      <Switch>
        <Route exact path={path}>
          {/* Показать что-то, когда пользователь в /parent */}
        </Route>
        <Route path={`${path}/child1`}>
          {/* Передаем данные в Child1 */}
          <Child1 data={data} />
        </Route>
        <Route path={`${path}/child2`}>
          {/* Передаем данные в Child2 */}
          <Child2 data={data} />
        </Route>
      </Switch>
    </div>
  );
}
```

4. В каждом из дочерних компонентов используйте полученные данные из props (или из глобального стейта) для отображения содержимого.

```jsx
function Child1({ data }) {
  // использовать данные здесь
  return (
    <div>
      {/* Рендерим содержимое для Child1 используя data */}
    </div>
  );
}
```

5. Если у вас есть сайдбар с выпадающими пунктами, можете использовать компоненты `Link` или `NavLink` для навигации:

```jsx
import { Link } from 'react-router-dom';

// В вашем сайдбаре
<ul>
  <li><Link to="/parent/child1">Child 1</Link></li>
  <li><Link to="/parent/child2">Child 2</Link></li>
</ul>
```

Это базовый пример того, как можно организовать вложенную маршрутизацию с динамической загрузкой данных. Более сложная структура может потребовать использования дополнительных шаблонов проектирования и инструментов управления состоянием.
А зачем куча страниц с одинаковым контентом? 
Если хоть что-то разное то прокидывайте какой-то slug в url страницы и получайте его уже с помощью useParams().

А потом уже запросом с сервера данные получаете.

Вложенность роутов делается примерно так:

Чтобы получить query параметры из url:
const { id } = useParams();
Похожие вопросы