Cách đặt DefaultRoute thành Route khác trong React Router


98

Tôi có những thứ sau:

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

Khi sử dụng DefaultRoute, SearchDashboard hiển thị không chính xác vì bất kỳ * Trang tổng quan nào cũng cần được hiển thị trong Trang tổng quan.

Tôi muốn DefaultRoute của mình trong Tuyến đường "ứng dụng" để trỏ đến Tuyến đường "searchDashboard". Đây là điều mà tôi có thể làm với React Router hay tôi nên sử dụng Javascript thông thường (để chuyển hướng trang) cho việc này?

Về cơ bản, nếu người dùng truy cập trang chủ, thay vào đó tôi muốn gửi họ đến bảng điều khiển tìm kiếm. Vì vậy, tôi đoán tôi đang tìm kiếm một tính năng của Bộ định tuyến React tương đương vớiwindow.location.replace("mygreathostname.com/#/dashboards/searchDashboard");


1
Bạn đã thử sử dụng Redirect thay vì DefaultRoute chưa? <Redirect from = "/" to = "searchDashboard" />
Jonatan Lundqvist Medén

@ JonatanLundqvistMedén đó chính xác là những gì tôi đang tìm kiếm, cảm ơn bạn! Viết nó như một câu trả lời và tôi sẽ đánh dấu nó là đúng. Xin lỗi vì đã ngừng trả lời.
Matthew Herbst

Câu trả lời:


148

Bạn có thể sử dụng Redirect thay vì DefaultRoute

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

Thay vào đó, hãy cập nhật 2019-08-09 để tránh sự cố khi sử dụng làm mới tính năng này, nhờ Ogglas

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

6
có phải chỉ tôi không, hay khi sử dụng điều này để truy cập trực tiếp vào một url sâu, tôi luôn được chuyển hướng đến url "tới", thay vì tuyến đường mà tôi đang cố truy cập?
Pablote

Cần lưu ý rằng nếu bạn đang thực hiện một số chuyển hướng như from='/a' to='/a/:id', bạn sẽ cần sử dụng <Switch>để bao gồm của bạn <Redirect><Route>thành phần từ bộ định tuyến phản ứng. Thông tin chi tiết xem doc
Kulbear,

1
@Kulbear Tôi đã gặp vấn đề tương tự. Làm những gì Ogglas nói trong câu trả lời của mình đã có hiệu quả.
Alan P.

2
Để làm cho nó làm việc nhiều khả năng bạn cần phải đưa tuyến đường này cuối cùng hoặc làm điều này<Redirect exact from="/" to="/adaptation" />
DarkWalker

Thật dễ dàng để giám sát nó, vì vậy tôi nhắc lại: Phần quan trọng của quy tắc Chuyển hướng của DarkWalker là exactlá cờ. Câu trả lời acceptet bị thiếu, vì vậy nó phù hợp với [hầu như] bất kỳ tuyến nào.
'19

55

Vấn đề với việc sử dụng <Redirect from="/" to="searchDashboard" />là nếu bạn có một URL khác, chẳng hạn /indexDashboardvà người dùng nhấn vào làm mới hoặc nhận được một URL được gửi đến họ, người dùng sẽ được chuyển hướng đến/searchDashboard .

Nếu bạn không phải là người dùng để có thể làm mới trang web hoặc gửi URL, hãy sử dụng cái này:

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

Sử dụng cái này nếu searchDashboardđăng nhập sau:

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

37

Tôi đã không chính xác khi cố gắng tạo một đường dẫn mặc định với:

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

Nhưng điều này tạo ra hai đường dẫn khác nhau hiển thị cùng một thành phần. Điều này không chỉ vô nghĩa mà còn có thể gây ra trục trặc trong giao diện người dùng của bạn, tức là khi bạn đang tạo kiểu <Link/>các phần tử dựa trênthis.history.isActive() .

Cách phù hợp để tạo một tuyến mặc định (đó không phải là tuyến chỉ mục) là sử dụng <IndexRedirect/>:

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

Điều này dựa trên react-router 1.0.0. Xem https://github.com/rackt/react-router/blob/master/modules/IndexRedirect.js .


Có ích gì khi có một Routethứ gì đó đã được xử lý bởi bạn IndexRoute?
Matthew Herbst

1
Không có ý gì cả, và tôi đã chỉnh sửa câu trả lời của mình để làm rõ rằng tôi không ủng hộ điều đó.
Seth

Đây là những gì tôi cũng đang làm, nhưng tôi muốn có một giải pháp phục vụ một thành phần (trang chủ của tôi) /thay vì phải chuyển hướng đến ví dụ /home.
ericsoco

Có vẻ như tôi đang tìm kiếm <IndexRoute>sau tất cả. Xin lỗi vì sự ồn ào. stackoverflow.com/questions/32706913/… github.com/reactjs/react-router/blob/master/docs/guides/…
ericsoco

11

Câu trả lời của Jonathan dường như không hiệu quả với tôi. Tôi đang sử dụng React v0.14.0 và React Router v1.0.0-rc3. Điều này đã làm:

<IndexRoute component={Home}/>.

Vì vậy, trong Trường hợp của Matthew, tôi tin rằng anh ấy muốn:

<IndexRoute component={SearchDashboard}/>.

Nguồn: https://github.com/rackt/react-router/blob/master/docs/guides/advanced/ComponentLifecycle.md


Cảm ơn vì đã chia sẻ. Tôi đang sử dụng React v0.13 và phiên bản của React-Router cho điều đó, vì vậy phiên bản trước 1.0 / rc. Hy vọng điều này sẽ giúp những người khác!
Matthew Herbst

Tôi nghĩ rằng điều này làm cho bạn mất bối cảnh. SearchDashboardsẽ là thành phần bạn sẽ thấy khi đến trang chủ, nhưng không phải là Dashboardthành phần bao bọc nó nếu bạn truy cập trực tiếp /dashboard/searchDashboard. React-router xây dựng động một hệ thống phân cấp của các thành phần lồng nhau dựa trên các tuyến được khớp với URL, vì vậy tôi nghĩ bạn thực sự cần chuyển hướng ở đây.
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

điều này sẽ làm cho nó để khi bạn tải lên máy chủ trên máy chủ cục bộ, nó sẽ hướng bạn đến / cái gì đó


5

CẬP NHẬT : 2020

Thay vì sử dụng Chuyển hướng, Chỉ cần thêm nhiều tuyến đường trong path

Thí dụ:

<Route exact path={["/","/defaultPath"]} component={searchDashboard} />

3

Tôi đã gặp phải một vấn đề tương tự; Tôi muốn một trình xử lý tuyến đường mặc định nếu không có trình xử lý tuyến đường nào phù hợp.

Giải pháp của tôi là sử dụng ký tự đại diện làm giá trị đường dẫn. tức là Hãy chắc chắn rằng nó là mục nhập cuối cùng trong định nghĩa các tuyến đường của bạn.

<Route path="/" component={App} >
    <IndexRoute component={HomePage} />
    <Route path="about" component={AboutPage} />
    <Route path="home" component={HomePage} />
    <Route path="*" component={HomePage} />
</Route>

3

Đối với những người sắp bước vào năm 2017, đây là giải pháp mới với 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>

Tương đương là gì DefaultRoutetrong react-routerv4?
Anthony Kong

4
@AnthonyKong Tôi nghĩ rằng đó là: <Route exact path="/" component={Home}/>. reacttraining.com/react-router/web/example/basic
TYMG,

1

Phương pháp ưu tiên là sử dụng thành phần IndexRoutes của bộ định tuyến phản ứng

Bạn sử dụng nó như thế này (lấy từ tài liệu bộ định tuyến phản ứng được liên kết ở trên):

<Route path="/" component={App}>
    <IndexRedirect to="/welcome" />
    <Route path="welcome" component={Welcome} />
    <Route path="about" component={About} />
</Route>

0

Bạn sử dụng nó như thế này để chuyển hướng trên một URL cụ thể và hiển thị thành phần sau khi chuyển hướng từ bộ định tuyến cũ sang bộ định tuyến mới.

<Route path="/old-router">
  <Redirect exact to="/new-router"/>
  <Route path="/new-router" component={NewRouterType}/>
</Route>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.