Phản ứng: sự khác biệt giữa <Lộ trình chính xác = Đường / Trực tiếp /> và <Đường dẫn = Đường / Tấn />


161

Ai đó có thể giải thích sự khác biệt giữa

<Route exact path="/" component={Home} />

<Route path="/" component={Home} />

Tôi không biết ý nghĩa của 'chính xác'


1
Các câu trả lời đều tuyệt vời. Tuy nhiên, người ta có thể nghi ngờ như "Tại sao chúng ta không thể có <code> chính xác </ code> cho tất cả các tuyến đường?" Hãy tưởng tượng một URL giống như thế này. <code> yourreactwebsite.com/getUsers/userId= ? </ code> Đây là một ví dụ trong đó ID người dùng sẽ được cung cấp động trong URL và vì vậy chúng tôi không thể sử dụng prop <code> chính xác </ code> trong Bộ định tuyến của bạn ở đây.
VIJAYKUMAR REDDY ALAVALA

Câu trả lời:


263

Trong ví dụ này, không có gì thực sự. Thông số exactphát huy tác dụng khi bạn có nhiều đường dẫn có cùng tên:

Ví dụ, hãy tưởng tượng chúng ta có một Usersthành phần hiển thị danh sách người dùng. Chúng tôi cũng có một CreateUserthành phần được sử dụng để tạo người dùng. Các url cho CreateUsersnên được lồng dưới Users. Vì vậy, thiết lập của chúng tôi có thể trông giống như thế này:

<Switch>
  <Route path="/users" component={Users} />
  <Route path="/users/create" component={CreateUser} />
</Switch>

Bây giờ vấn đề ở đây, khi chúng ta đi đến http://app.com/usersbộ định tuyến sẽ đi qua tất cả các tuyến đã xác định của chúng ta và trả về kết quả khớp đầu tiên mà nó tìm thấy. Vì vậy, trong trường hợp này, nó sẽ tìm Userstuyến đường trước và sau đó trả lại. Tất cả đều tốt.

Nhưng, nếu chúng tôi đã đi http://app.com/users/create, nó sẽ lại đi qua tất cả các tuyến đường đã xác định của chúng tôi và trả lại trận đấu ĐẦU TIÊN mà nó tìm thấy. Bộ định tuyến React không khớp một phần, do đó /userskhớp một phần /users/create, do đó nó sẽ trả lại Userstuyến một cách không chính xác !

Thông số exactvô hiệu hóa khớp một phần cho một tuyến và đảm bảo rằng nó chỉ trả về tuyến nếu đường dẫn là khớp chính xác với url hiện tại.

Vì vậy, trong trường hợp này, chúng ta nên thêm exactvào Userstuyến đường của mình để nó chỉ khớp với /users:

<Switch>
  <Route exact path="/users" component={Users} />
  <Route path="/users/create" component={CreateUser} />
</Switch>

Các tài liệu giải thích exactchi tiết và đưa ra các ví dụ khác.


11
"Nhưng, nếu chúng tôi đã truy cập app.com/users/create , nó sẽ lại đi qua tất cả các tuyến đường đã xác định của chúng tôi và trả lại trận đấu ĐẦU TIÊN mà nó tìm thấy." - trong thực tế, nó sẽ trả về tất cả các Tuyến mà nó tìm thấy khớp (đầy đủ hoặc một phần). Hành vi được mô tả bởi @Chase DeAnda sẽ chỉ xảy ra nếu các <Tuyến> được bao quanh bởi thẻ <Switch>.
watsabitz

4
exacttheo ý kiến ​​của tôi nên là mặc định
Alexander Derck

Thế còn nếu chúng ta có từng định nghĩa tuyến đường trong các thành phần khác nhau, ý tôi là /admin//userstrong thành phần Quản trị viên và /admin/users/createtrong thành phần Root ??? Tôi hiện đang có tình huống này và exactgiải pháp điển hình không hoạt động đúng.
Yulio Aleman Jimenez

Tôi nghĩ rằng hành vi này chỉ hoạt động nếu cả hai tuyến ở cùng cấp với cha mẹ (hoặc thành phần) của nó
Yulio Aleman Jimenez

1
@ChaseDeAnda những gì tôi cần hoàn toàn ngược lại. Có lẽ tôi nên viết một câu trả lời mới trên SO để làm rõ tình huống của mình và có được câu trả lời đúng.
Yulio Aleman Jimenez

7

Nói tóm lại, nếu bạn có nhiều tuyến đường được xác định cho định tuyến của ứng dụng, được đính kèm với Switchthành phần như thế này;

<Switch>

  <Route exact path="/" component={Home} />
  <Route path="/detail" component={Detail} />

  <Route exact path="/functions" component={Functions} />
  <Route path="/functions/:functionName" component={FunctionDetails} />

</Switch>

Sau đó, bạn phải đặt exacttừ khóa vào Tuyến đường mà đường dẫn của nó cũng được bao gồm bởi đường dẫn của Tuyến khác. Ví dụ: đường dẫn nhà /được bao gồm trong tất cả các đường dẫn vì vậy nó cần phải có exacttừ khóa để phân biệt nó với các đường dẫn khác bắt đầu bằng /. Lý do cũng tương tự như /functionsđường dẫn. Nếu bạn muốn sử dụng một tuyến đường khác như /functions-detailhoặc /functions/open-doorbao gồm /functionstrong đó thì bạn cần sử dụng exactcho /functionstuyến đường.



-1

Câu trả lời ngắn nhất là

Hãy thử điều này.

<switch>
   <Route exact path="/" component={Home} />
   <Route path="/about" component={About} />
   <Route path="/shop" component={Shop} />
 </switch>

1
Điều này về cơ bản không có gì để giải thích ý nghĩa của exactthuộc tính / prop, và do đó chắc chắn không phải là một "câu trả lời". Bạn nên cố gắng giải quyết câu hỏi thực sự đang được hỏi hơn là đưa ra giải pháp cho một vấn đề mà bạn không chắc OP thực sự có.
Victor Zamanian
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.