Tepki: <Rota tam yolu = "/" /> ve <Rota yolu = "/" /> arasındaki fark


189

Birisi arasındaki farkı açıklayabilir mi?

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

ve

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

'Kesin' kelimesinin anlamını bilmiyorum


1
Cevaplar harika. Ancak, "O zaman neden tüm rotalar için tam <code> tam </code> olamıyoruz?" Bunun gibi bir URL hayal edin. <code> reactwebsite.com/getUsers/userId= ? </code> Bu, kullanıcı kimliğinin dinamik olarak URL'de besleneceği bir örnektir ve bu nedenle burada Yönlendiricinizde <code> tam </code> prop ile gidemeyiz.
VIJAYKUMAR REDDY ALAVALA

Yanıtlar:


306

Bu örnekte gerçekten hiçbir şey yok. exactParam benzer adlara sahip birden çok yol olduğunda devreye giriyor:

Örneğin, Usersbir kullanıcı listesi gösteren bir bileşenimiz olduğunu varsayalım. Ayrıca CreateUserkullanıcı oluşturmak için kullanılan bir bileşenimiz var. URL'si CreateUsersaltında yuvalanmalıdır Users. Yani kurulumumuz şöyle görünebilir:

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

Şimdi buradaki sorun http://app.com/users, yönlendiriciye gittiğimizde tüm tanımlı rotalarımızdan geçecek ve bulduğu İLK eşleşmeye dönecektir. Yani bu durumda, önce Usersrotayı bulur ve sonra geri döner. Hepsi iyi.

Ancak, gidersek http://app.com/users/createyine tüm tanımlı rotalarımızdan geçer ve bulduğu İLK eşleşmeye döner. React yönlendiricisi kısmi eşleştirme yapar, bu nedenle /userskısmen eşleşir /users/create, bu nedenle yanlış bir şekilde Usersrotayı yeniden döndürür !

exactParam bir güzergah için kısmi eşleştirme devre dışı bırakır ve emin yolu geçerli url, TAM eşleme ise sadece rotayı döndüren yapar.

Yani bu durumda, biz eklemek gerekir exactbizim için Userssadece üzerine uyacak şekilde rota /users:

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

Dokümanlar exactayrıntılı olarak açıklar ve başka örnekler verir.


12
"Ancak, app.com/users/create adresine gidersek , yine tüm tanımlı rotalarımızdan geçer ve bulduğu İLK eşleşmeye döner." - aslında bir eşleşme bulduğu tüm Rotaları (tam veya kısmi) döndürür. @Chase DeAnda tarafından açıklanan davranış, yalnızca <Route> 'lar bir <Switch> etiketiyle çevrelenmişse gerçekleşir.
watsabitz

6
exactbence varsayılan olmalı
Alexander Derck

Her bir rota tanımını farklı bileşenlerde, yani /admin//usersYönetici bileşeninde ve /admin/users/createKök bileşeninde yaparsak ne olur ??? Şu anda bu durumdayım ve tipik exactçözüm düzgün çalışmıyor.
Yulio Aleman Jimenez

Sanırım bu davranış sadece her iki yol da Switch üst öğesi (veya bileşeni) ile aynı seviyedeyse
işe yarıyor

1
@ChaseDeAnda ihtiyacım olan tam tersi. Belki de durumumu netleştirmek ve doğru cevaplar almak için SO'ya yeni bir cevap yazmalıyım.
Yulio Aleman Jimenez

14

Kısacası, uygulamanızın rotası için tanımlanmış birden fazla rotanız varsa, Switchbunun gibi bileşenlerle birlikte ;

<Switch>

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

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

</Switch>

Daha sonra exact, yolunun başka bir Rotanın yolu tarafından da dahil edildiği Rotaya anahtar kelime koymanız gerekir . Örneğin, ev yolu /tüm yollara dahil edildiğinden, exactonu ile başlayan diğer yollardan ayırmak için anahtar sözcüğe sahip olması gerekir /. Nedeni de /functionsyola benzer . Gibi başka bir rota yolunu kullanmak isterseniz /functions-detailya /functions/open-dooriçeren /functionsİçinde ardından kullanmak gerekir exactiçin /functionsrota.


Öyleyse sadece kök 'kesin' doğru mu gerektirir?
LizardKing_96

3
Aslında ikinci bölüm bunu açıklıyor. Diyelim ki gibi 2 rotanız var /motorve /motorbikesonra exactpatika ile rotaya koymanız gerekiyor /motor. Aksi takdirde, hem /motorve /motorbikeyolları yolu ile bileşenini pick up /motor.
milkersarac


-3

En kısa cevap

Lütfen bunu deneyin.

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

1
Bu temelde exactözniteliğin / pervanenin anlamını açıklamak için hiçbir şey yapmaz ve bu nedenle kesinlikle bir "cevap" değildir. OP'nin gerçekten sahip olduğundan emin olmadığınız bir soruna çözüm sunmaktansa, gerçekten sorulan soruyu ele almaya çalışmalısınız.
Victor Zamanian
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.