Як встановити 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 відображається неправильно, оскільки будь-яка * Інформаційна панель повинна бути відображена на панелі керування.

Я хотів би, щоб мій DefaultRoute в межах програми "Додаток" вказав на "ПошукDashboard" маршруту. Це щось, що я можу зробити з React Router, або я повинен використовувати для цього звичайний Javascript (для перенаправлення сторінки)?

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


1
Ви спробували використовувати Redirect замість DefaultRoute? <Redirect from = "/" to = "searchDashboard" />
Jonatan Lundqvist Medén

@ JonatanLundqvistMedén це саме те, що я шукав, дякую! Напишіть це як відповідь, і я позначу це правильним. Вибачте за затримку відповіді.
Меттью Гербст

Відповіді:


148

Ви можете використовувати Redirect замість DefaultRoute

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

Оновіть 2019-08-09, щоб уникнути проблем із оновленням використовуйте це замість цього, завдяки Ogglas

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

6
це лише я, або коли я використовую це для прямого натискання глибокої URL-адреси, мене завжди переспрямовують на URL-адресу "to", замість маршруту, який я намагаюся здійснити?
Паблоте,

Слід зазначити, що якщо ви робите певне перенаправлення, наприклад from='/a' to='/a/:id', вам потрібно буде використовувати <Switch>для включення вашого <Redirect>і <Route>компонента з реакційного маршрутизатора. Деталі див. У документі
Kulbear

1
@Kulbear У мене була та сама проблема. Робити те, що сказав Огглас у своїй відповіді, спрацювало.
Алан П.

2
Щоб це спрацювало, вам, швидше за все, потрібно останньо вказати цей маршрут або зробити це<Redirect exact from="/" to="/adaptation" />
DarkWalker,

Це легко наглядати, тому я повторюю: важливою частиною правила перенаправлення DarkWalker є exactпрапор. Відповіді акцепту не вистачає, тому вона відповідає [майже] будь-якому маршруту.
Дуб

55

Проблема з використанням <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"/>
  )
)}/>

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.
ericsoco

Схоже, я все-таки шукаю <IndexRoute>. Вибачте за шум. stackoverflow.com/questions/32706913 / ... github.com/reactjs/react-router/blob/master/docs/guides / ...
ericsoco

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

це зробить так, що коли ви завантажите сервер на локальний хост, він перенаправить вас до / чогось


5

ОНОВЛЕННЯ : 2020

Замість того, щоб використовувати Redirect, просто додайте кілька маршрутів у 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>

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>

Що таке еквівалент DefaultRouteв react-routerv4?
Ентоні Конг,

4
@AnthonyKong Я думаю , що це: <Route exact path="/" component={Home}/>. responsetraining.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>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.