Я использую один и тот же компонент для трех разных маршрутов:
<Router>
<Home path="/" />
<Home path="/home" />
</Router>
Есть ли способ совместить это, чтобы быть похожим на:
<Router>
<Home path=["/home", "/"] />
</Router>
Я использую один и тот же компонент для трех разных маршрутов:
<Router>
<Home path="/" />
<Home path="/home" />
</Router>
Есть ли способ совместить это, чтобы быть похожим на:
<Router>
<Home path=["/home", "/"] />
</Router>
Для Reach Router: (https://reach.tech/router/example/)
С показанным точным образцом единственный способ увидеть, как это сделать (в одной строке), - это использовать подстановочный знак.
Чтобы найти способ воспроизвести это без побочных эффектов, нам нужно увидеть все навигационное меню.
<Router>
<Home path="/*" />
<Chicken path="chicken">
</Router>
...
const Home = props => {
let urlPath = props["*"]
// URL: "/home"
// urlPath === "home"
// URL/: "/"
// urlPath ===""
}
Вы можете продолжить с другими путями ниже Home, и маршрутизатор разрешит их обработку.
Ознакомьтесь с примером использования подстановочного знака и досягаемости маршрутизатора на codeandbox, я написал!< /а>
Примечание. Это универсальное решение, но без разбора параметра это единственное однострочное решение, которое я видел.
Некоторые недостатки включают рендеринг Home вместо «404» и т. д.
// Это можно решить с помощью оператора if в вашем рендере
// Он не будет создавать предполагаемый URL-адрес для /home, и я не изучал это, поскольку это не является частью вопроса ... но если он соответствует реквизитам [*], я уверен, что вы могли бы перенаправить или что-то в этом роде.
Вы можете прочитать больше о компоненте маршрута для Reach Router. https://reach.tech/router/api/RouteComponent
Меня не устраивало решение с подстановочными знаками из документации и @cullen-bond, потому что мне пришлось сопоставлять множество других путей, и я придумал это решение:
<Router>
{["/home", "/", "/other", "/a-lot-more"].map(page => <Home path={page} />)}
</Router>
Пример: https://codesandbox.io/s/reach-router-starter-v1-forked-6f44c?file=/src/index.js
Я думаю, вы можете сделать это, как вы хотели. Взгляните на это: https://reacttraining.com/react-router/core/api/Route/path-string-string
Вы можете использовать один компонент для нескольких путей, используя массив маршрутов.
пример кода:
импортировать sampleComponent из './sampleComponent'; // один компонент для нескольких маршрутов
<Router>
<Switch>
{["/pathname_1", "/pathname_2", "/pathname_3", "/pathname_4", "/pathname_5", "/pathname_6"].map(pathname => (<Route exact path={pathname} component={sampleComponent} />) )}
<Switch>
<Router>