React Router với tham số đường dẫn tùy chọn


306

Tôi muốn khai báo một đường dẫn với một tham số đường dẫn tùy chọn, do đó khi tôi thêm nó vào trang để làm điều gì đó thêm (ví dụ: điền một số dữ liệu):

http: // localhost / app / path / to / page <= kết xuất trang http: // localhost / app / path / to / page / pathParam <= kết xuất trang với một số dữ liệu theo pathParam

Trong bộ định tuyến phản ứng của tôi, tôi có các đường dẫn sau, để hỗ trợ hai tùy chọn (đây là một ví dụ đơn giản):

<Router history={history}>    
   <Route path="/path" component={IndexPage}>
      <Route path="to/page" component={MyPage}/>
      <Route path="to/page/:pathParam" component={MyPage}/>
   </Route>    
</Router>

Câu hỏi của tôi là, chúng ta có thể khai báo nó trong một tuyến đường không? Nếu tôi chỉ thêm hàng thứ hai thì tuyến không có tham số sẽ không được tìm thấy.

EDIT # 1:

Giải pháp được đề cập ở đây về cú pháp sau đây không hiệu quả với tôi, liệu nó có đúng không? Có tồn tại trong tài liệu?

<Route path="/product/:productName/?:urlID?" handler={SomeHandler} />

Phiên bản bộ định tuyến phản ứng của tôi là: 1.0.3

Câu trả lời:


650

Bản chỉnh sửa bạn đã đăng là hợp lệ cho phiên bản cũ hơn của React-router (v0.13) và không hoạt động nữa.


Phản ứng Bộ định tuyến v1, v2 và v3

Vì phiên bản 1.0.0bạn xác định các tham số tùy chọn với:

<Route path="to/page(/:pathParam)" component={MyPage} />

và cho nhiều tham số tùy chọn :

<Route path="to/page(/:pathParam1)(/:pathParam2)" component={MyPage} />

Bạn sử dụng dấu ngoặc đơn ( )để bọc các phần tùy chọn của tuyến đường, bao gồm dấu gạch chéo hàng đầu ( /). Kiểm tra trang Hướng dẫn kết hợp tuyến đường của tài liệu chính thức.

Lưu ý: Các :paramNamethông số phù hợp với một phân khúc URL đến tiếp theo /, ?hoặc #. Để biết thêm về đường dẫn và thông số cụ thể, đọc thêm ở đây .


React Router v4 trở lên

React Router v4 khác về cơ bản so với v1-v3 và các tham số đường dẫn tùy chọn không được xác định rõ ràng trong tài liệu chính thức .

Thay vào đó, bạn được hướng dẫn xác định một paththam số mà đường dẫn đến regrec hiểu. Điều này cho phép linh hoạt hơn nhiều trong việc xác định đường dẫn của bạn, chẳng hạn như lặp lại các mẫu, ký tự đại diện, v.v. Vì vậy, để xác định một tham số là tùy chọn, bạn thêm dấu chấm hỏi (? ).

Như vậy, để xác định một tham số tùy chọn, bạn làm:

<Route path="/to/page/:pathParam?" component={MyPage} />

và cho nhiều tham số tùy chọn :

<Route path="/to/page/:pathParam1?/:pathParam2?" component={MyPage} />

Lưu ý: React Router v4 không tương thích với( đọc thêm ở đây ). Sử dụng phiên bản v3 trở về trước (khuyến nghị v2).


2
Đây vẫn là một câu hỏi về nhiều thông số tùy chọn trong URL, như/route(/:category/(:article)
Alex Shwarc

1
@AlexShwarc, điểm tốt, cảm ơn. Tôi đã thêm mã để chứng minh nhiều tham số tùy chọn. Có một cái nhìn.
Chris

1
@Chris Tôi chắc chắn, nó không hoạt động theo cách này, bạn đã kiểm tra chưa?
Alex Shwarc

@Chris với 3 phiên bản
Alex Shwarc

1
Tôi có thể tạo thông số đường dẫn tùy chọn cho tuyến đường chính không? Ví dụ: tôi cần thêm thông số ngôn ngữ vào đường dẫn và url trang chủ của tôi sẽ là "/" và "/ en" Đây là bản demo
Kholiavko

76

Đối với bất kỳ người dùng React Router v4 nào đến đây sau khi tìm kiếm, các tham số tùy chọn trong một <Route>được biểu thị bằng ?hậu tố.

Đây là tài liệu liên quan:

https://reacttraining.com/react-router/web/api/Route/path- chuỗi

đường dẫn: chuỗi

Bất kỳ đường dẫn URL hợp lệ nào mà đường dẫn đến regrec đều hiểu.

<Route path="/users/:id" component={User}/>

https://www.npmjs.com/package/path-to-regEx#optional

Không bắt buộc

Các tham số có thể được thêm vào bằng dấu chấm hỏi (?) Để làm cho tham số tùy chọn. Điều này cũng sẽ làm cho tiền tố tùy chọn.


Ví dụ đơn giản về một phần được phân trang của một trang web có thể được truy cập có hoặc không có số trang.

<Route path="/section/:page?" component={Section} />

@ user2928231 Cảm ơn, đã cập nhật với url tài liệu mới của họ. Theo như tôi có thể nói <Match pattern />bây giờ là <Route path />một lần nữa, nhưng hậu tố dấu hỏi vẫn là cách tiếp cận để xử lý các thông số tùy chọn.
John

2
Chào! Tôi vẫn còn có một vấn đề với tham số tùy chọn và không thể làm cho các tuyến đường tiếp theo làm việc: Tôi có players, players/123, players/123/edit, players?unseen=true. Tham số tùy chọn ?unseenkhông hoạt động đối với tôi. mặc dù tôi đã thử tất cả các bản sửa lỗi từ cuộc thảo luận này. Bạn có thể vui lòng giúp đỡ với chuỗi đường dẫn thích hợp, sẽ xử lý việc này không? Cảm ơn trước!
Khrystyna Skvarok

Xin chào @KhrystynaSkvarok, bạn đã bao giờ tìm ra cách để đường dẫn của bạn có một chuỗi truy vấn tùy chọn hoạt động chưa? Tôi đang cố gắng làm điều tương tự
sabliao

2
@sableiao Chào! Tôi không có ví dụ hoạt động, nhưng đối với URL như example.com/search?query=testthử sử dụng mẫu tiếp theo /:search(search).
Khrystyna Skvarok

Làm cách nào tôi có thể nhận được thông số từ url sau dấu phân cách?
Ninja Ninja

15

Cú pháp làm việc cho nhiều thông số tùy chọn:

<Route path="/section/(page)?/:page?/(sort)?/:sort?" component={Section} />

Bây giờ, url có thể là:

  1. /phần
  2. / phần / trang / 1
  3. / phần / trang / 1 / sắp xếp / asc

1

cho bộ định tuyến phản ứng V5 trở lên sử dụng cú pháp dưới đây cho nhiều đường dẫn

<Route
          exact
          path={[path1, path2]}
          component={component}
        />
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.