Как установить DefaultRoute на другой маршрут в React Router

98

Имею следующее:

  <Route name="app" path="/" handler={App}>
    <Route name="dashboards" path="dashboards" handler={Dashboard}>
      <Route name="exploreDashboard" path="exploreDashboard" handler={ExploreDashboard} />
      <Route name="searchDashboard" path="searchDashboard" handler={SearchDashboard} />
      <DefaultRoute handler={DashboardExplain} />
    </Route>
    <DefaultRoute handler={SearchDashboard} />
  </Route>

При использовании DefaultRoute SearchDashboard отображается некорректно, поскольку любая * Dashboard должна отображаться в Dashboard.

Я хотел бы, чтобы мой DefaultRoute в маршруте «app» указывал на «searchDashboard» маршрута. Могу ли я это сделать с помощью React Router, или мне следует использовать для этого обычный Javascript (для перенаправления страницы)?

В основном, если пользователь переходит на домашнюю страницу, я хочу отправить его вместо этого на панель поиска. Итак, я думаю, я ищу функцию React Router, эквивалентнуюwindow.location.replace("mygreathostname.com/#/dashboards/searchDashboard");

Мэтью Хербст
источник
1
Вы пробовали использовать Redirect вместо DefaultRoute? <Redirect from = "/" to = "searchDashboard" />
Джонатан Лундквист Меден
@ JonatanLundqvistMedén это именно то, что я искал, спасибо! Напишите это как ответ, и я отмечу его как правильный. Приносим извинения за задержку с ответом.
Мэтью Хербст,

Ответы:

150

Вы можете использовать Redirect вместо DefaultRoute

<Redirect from="/" to="searchDashboard" />

Обновите 2019-08-09, чтобы избежать проблем с обновлением, используйте это вместо этого, благодаря Ogglas

<Redirect exact from="/" to="searchDashboard" />
Джонатан Лундквист Меден
источник
6
это только я, или когда я использую это для прямого доступа к глубокому URL-адресу, я всегда перенаправляюсь на URL-адрес, а не на маршрут, который я пытаюсь найти?
Паблот
Следует заметить , что если вы делаете какое - то переназначение , как from='/a' to='/a/:id', вам нужно будет использовать , <Switch>чтобы включить свой <Redirect>и <Route>компонент от реакции-маршрутизатора. Подробнее см документ
Kulbear
1
@Kulbear У меня была такая же проблема. Выполнение того, что сказал Огглас в своем ответе, сработало.
Алан П.
2
Чтобы он работал, вам, скорее всего, нужно поставить этот маршрут последним или сделать это<Redirect exact from="/" to="/adaptation" />
DarkWalker
За этим легко наблюдать, поэтому я повторяю: важная часть правила перенаправления DarkWalker - это exactфлаг. В принятом ответе этого нет, поэтому он соответствует [почти] любому маршруту.
dube
56

Проблема с использованием <Redirect from="/" to="searchDashboard" />заключается в том, что если у вас другой URL-адрес, скажем, /indexDashboardи пользователь нажимает кнопку «Обновить» или получает отправленный им URL-адрес, пользователь в /searchDashboardлюбом случае будет перенаправлен на него .

Если вы не хотите, чтобы пользователи могли обновлять сайт или отправлять URL-адреса, используйте это:

<Route exact path="/" render={() => (
    <Redirect to="/searchDashboard"/>
)}/>

Используйте это, если searchDashboardза логином:

<Route exact path="/" render={() => (
  loggedIn ? (
    <Redirect to="/searchDashboard"/>
  ) : (
    <Redirect to="/login"/>
  )
)}/>
Ogglas
источник
37

Я неправильно пытался создать путь по умолчанию с помощью:

<IndexRoute component={DefaultComponent} />
<Route path="/default-path" component={DefaultComponent} />

Но это создает два разных пути, которые отображают один и тот же компонент. Это не только бессмысленно, но и может вызвать сбои в вашем пользовательском интерфейсе, то есть когда вы стилизуете <Link/>элементы на основе this.history.isActive().

Правильный способ создания маршрута по умолчанию (который не является маршрутом индекса) - использовать <IndexRedirect/>:

<IndexRedirect to="/default-path" />
<Route path="/default-path" component={DefaultComponent} />

Это основано на реактивном маршрутизаторе 1.0.0. См. Https://github.com/rackt/react-router/blob/master/modules/IndexRedirect.js .

Сет
источник
Какой смысл иметь дело с Routeтем, чем вы уже занимались IndexRoute?
Мэтью Хербст,
1
В этом нет смысла, и я отредактировал свой ответ, чтобы было ясно, что я не защищаю это.
Сет
Я тоже этим занимаюсь, но мне бы понравилось решение, которое обслуживает компонент (мою домашнюю страницу) /вместо того, чтобы перенаправлять, например, на /home.
ericoco
Похоже, я все-таки ищу <IndexRoute>. Извините за шум. stackoverflow.com/questions/32706913/… github.com/reactjs/react-router/blob/master/docs/guides/…
ericsoco 08
11

Ответ Джонатана, похоже, не сработал для меня. Я использую React v0.14.0 и React Router v1.0.0-rc3. Это сделало:

<IndexRoute component={Home}/>.

Итак, в случае Мэтью, я думаю, он хотел бы:

<IndexRoute component={SearchDashboard}/>.

Источник: https://github.com/rackt/react-router/blob/master/docs/guides/advanced/ComponentLifecycle.md

уменьшиться
источник
Спасибо за долю. Я использовал для этого React v0.13 и версию React-Router, так что версия до 1.0 / rc. Надеюсь, это поможет другим!
Мэтью Хербст,
Я думаю, из-за этого вы теряете контекст. SearchDashboardбудет компонентом, который вы увидите, когда перейдете на домашнюю страницу, но не Dashboardкомпонентом, который его обертывает, если вы перейдете непосредственно на /dashboard/searchDashboard. React-router динамически создает иерархию вложенных компонентов на основе маршрутов, соответствующих URL-адресу, поэтому я думаю, что вам действительно нужно перенаправление здесь.
Stijn de Witt
6
import { Route, Redirect } from "react-router-dom";

class App extends Component {
  render() {
    return (
      <div>
        <Route path='/'>
          <Redirect to="/something" />
        </Route>
//rest of code here

это сделает так, что когда вы загружаете сервер на локальный хост, он перенаправит вас на / something


источник
5

ОБНОВИТЬ : 2020

Вместо использования перенаправления просто добавьте несколько маршрутов в path

Пример:

<Route exact path={["/","/defaultPath"]} component={searchDashboard} />
Танвир Шах
источник
3

Я столкнулся с подобной проблемой; Мне нужен обработчик маршрута по умолчанию, если ни один из обработчиков маршрута не подходит.

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

<Route path="/" component={App} >
    <IndexRoute component={HomePage} />
    <Route path="about" component={AboutPage} />
    <Route path="home" component={HomePage} />
    <Route path="*" component={HomePage} />
</Route>
devil_io
источник
3

Для тех, кто приходит в 2017 г., это новое решение с IndexRedirect:

<Route path="/" component={App}>
  <IndexRedirect to="/welcome" />
  <Route path="welcome" component={Welcome} />
  <Route path="about" component={About} />
</Route>
Кевин Эрнандес
источник
2
 <Route name="app" path="/" handler={App}>
    <Route name="dashboards" path="dashboards" handler={Dashboard}>
      <Route name="exploreDashboard" path="exploreDashboard" handler={ExploreDashboard} />
      <Route name="searchDashboard" path="searchDashboard" handler={SearchDashboard} />
      <DefaultRoute handler={DashboardExplain} />
    </Route>
    <Redirect from="/*" to="/" />
  </Route>
user3889017
источник
Что эквивалентно DefaultRouteв react-routerv4?
Энтони Конг,
4
@AnthonyKong Я думаю , что это: <Route exact path="/" component={Home}/>. reacttraining.com/react-router/web/example/basic
TYMG
1

Предпочтительный метод - использовать компонент IndexRoutes реактивного маршрутизатора.

Вы используете это так (взято из документации по маршрутизатору реакции, указанной выше):

<Route path="/" component={App}>
    <IndexRedirect to="/welcome" />
    <Route path="welcome" component={Welcome} />
    <Route path="about" component={About} />
</Route>
Марк Костелло
источник
0

Вы используете его таким образом для перенаправления на определенный URL-адрес и визуализации компонента после перенаправления со старого маршрутизатора на новый маршрутизатор.

<Route path="/old-router">
  <Redirect exact to="/new-router"/>
  <Route path="/new-router" component={NewRouterType}/>
</Route>
Surbhi241
источник