Пожалуйста, прочтите этот вопрос до конца, прежде чем пометить его как дубликат.У меня есть несколько макетов, которые должны включать в себя разные экраны.Каждый макет имеет свой собственный верхний и нижний колонтитулы и другие вещи, которыми должны поделиться схожие страницы.Вот код, который я придумал:
<BrowserRouter>
<Route path={['/index', '/about']} component={BaseLayout}>
<Route path="/index" component={Index} />
<Route path="/about" component={About} />
</Route>
<Route path={['/sign-in', '/sign-up']} component={AuthLayout}>
<Route path="/sign-in" component={SignIn} />
<Route path="/sign-up" component={SignUp} />
</Route>
<Route path={['/stats'} component={DashboardLayout}>
<Route path="/stats" component={Stats} />
</Route>
</BrowserRouter>
Код выше, очевидно, не будет работать, потому что:
Предупреждение: вы не должны использовать <Route component>
и в том жемаршрут;<Route component>
будет игнорироваться
Ответы на похожие вопросы по SO предлагают использовать компоненты-оболочки напрямую:
<BrowserRouter>
<BaseLayout>
<Route path="/index" component={Index} />
<Route path="/about" component={About} />
</BaseLayout>
<AuthLayout>
<Route path="/sign-in" component={SignIn} />
<Route path="/sign-up" component={SignUp} />
</AuthLayout>
<DashboardLayout>
<Route path="/stats" component={Stats} />
</DashboardLayout>
</BrowserRouter>
Проблема этого подхода в том, что даже при том, что он отображает один экранон также отображает элементы из других макетов, т. е. если вы находитесь на странице индекса, отображаемой внутри BaseLayout
, вы также увидите элементы из AuthLayout
и DashboardLayout
.Что имеет смысл, потому что они не заключены в Route
.
Некоторые люди предлагали захватить содержимое всех макетов и добавить их как родных братьев к текущим маршрутам.Однако это беспорядок для меня.Я хочу сохранить все макеты в отдельных файлах и передавать им только экраны как дети.
Буду признателен за любую помощь!