ตอบสนอง: ความแตกต่างระหว่าง <เส้นทางที่แน่นอน = = / / /> เส้นทางที่เส้นทาง = "/" />


162

บางคนสามารถอธิบายความแตกต่างระหว่าง

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

และ

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

ฉันไม่รู้ความหมายของ 'แน่นอน'


1
คำตอบนั้นยอดเยี่ยมมาก อย่างไรก็ตามอาจมีข้อสงสัยเช่น "ทำไมเราจึงไม่มี <code> ที่แน่นอน </code> สำหรับเส้นทางทั้งหมดแล้ว?" ลองนึกภาพ URL ที่เป็นอย่างนี้ <code> yourreactwebsite.com/getUsers/userId= ? </code> นี่คือตัวอย่างที่ ID ของผู้ใช้จะถูกป้อนใน URL แบบไดนามิกดังนั้นเราจึงไม่สามารถไปกับ <code> </code> ที่แน่นอน </code> prop ในเราเตอร์ของคุณที่นี่
VIJAYKUMAR REDDY ALAVALA

คำตอบ:


264

ในตัวอย่างนี้ไม่มีอะไรจริงๆ exactพระรามมาลงเล่นเมื่อคุณมีหลายเส้นทางที่มีชื่อคล้ายกัน:

ตัวอย่างเช่นสมมติว่าเรามีUsersส่วนประกอบที่แสดงรายการผู้ใช้ เรายังมีCreateUserส่วนประกอบที่ใช้ในการสร้างผู้ใช้ URL ของสำหรับควรจะซ้อนกันภายใต้CreateUsers Usersดังนั้นการตั้งค่าของเราอาจมีลักษณะดังนี้:

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

ตอนนี้ปัญหาที่นี่เมื่อเราไปhttp://app.com/usersที่เราเตอร์จะผ่านเส้นทางที่กำหนดทั้งหมดของเราและส่งคืนการแข่งขันครั้งแรกที่พบ ดังนั้นในกรณีนี้มันจะหาUsersเส้นทางก่อนแล้วจึงส่งคืน ทั้งหมดดี.

แต่ถ้าเราไปถึงhttp://app.com/users/createมันจะผ่านเส้นทางที่เรากำหนดไว้ทั้งหมดอีกครั้งและกลับมาพบกับการแข่งขันครั้งแรก React เร้าเตอร์ทำการจับคู่/usersบางส่วน/users/createดังนั้นจะจับคู่บางส่วนดังนั้นมันจะส่งคืนUsersเส้นทางไม่ถูกต้องอีกครั้ง

exactพระรามปิดการใช้งานการจับคู่บางส่วนสำหรับเส้นทางและทำให้แน่ใจว่ามันส่งกลับเฉพาะเส้นทางถ้าเส้นทางตรงไปยัง URL ปัจจุบัน

ดังนั้นในกรณีนี้เราควรเพิ่มเส้นทางexactของเราUsersเพื่อให้ตรงกับ/users:

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

เอกสารอธิบายexactรายละเอียดและยกตัวอย่างอื่น ๆ


11
"แต่ถ้าเราไปที่app.com/users/createมันจะต้องผ่านเส้นทางที่กำหนดไว้ทั้งหมดของเราอีกครั้งและกลับมาพบกับ FIRST ครั้งแรก" - ในความเป็นจริงมันจะกลับเส้นทางทั้งหมดที่พบการแข่งขัน (เต็มหรือบางส่วน) พฤติกรรมที่อธิบายโดย @Chase DeAnda จะเกิดขึ้นก็ต่อเมื่อแท็ก <Route> ถูกล้อมรอบด้วยแท็ก <Switch>
watsabitz

4
exactควรเป็นค่าเริ่มต้นในความคิดของฉัน
Alexander Derck

จะเป็นอย่างไรถ้าเรามีคำจำกัดความของเส้นทางแต่ละอันในส่วนประกอบที่แตกต่างกันฉันหมายถึง/admin//usersในองค์ประกอบของผู้ดูแลระบบและ/admin/users/createในองค์ประกอบรูท ??? ขณะนี้ฉันมีสถานการณ์เช่นนี้และexactวิธีการแก้ปัญหาทั่วไปไม่ทำงานอย่างถูกต้อง
Yulio Aleman Jimenez

ฉันคิดว่าพฤติกรรมนี้ใช้ได้เฉพาะในกรณีที่ทั้งสองเส้นทางอยู่ในระดับเดียวกับพาเรนต์ของสวิตช์ (หรือส่วนประกอบ)
Yulio Aleman Jimenez

1
@ChaseDeAnda สิ่งที่ฉันต้องการคือสิ่งที่ตรงกันข้าม บางทีฉันควรจะเขียนคำตอบใหม่ใน SO เพื่อชี้แจงสถานการณ์ของฉันและรับคำตอบที่ถูกต้อง
Yulio Aleman Jimenez

7

กล่าวโดยย่อหากคุณมีหลายเส้นทางที่กำหนดไว้สำหรับการกำหนดเส้นทางแอปของคุณล้อมรอบด้วยSwitchองค์ประกอบเช่นนี้

<Switch>

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

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

</Switch>

จากนั้นคุณจะต้องใส่exactคำสำคัญในเส้นทางที่เส้นทางนั้นรวมอยู่ด้วยเส้นทางของเส้นทางอื่น ยกตัวอย่างเช่นเส้นทางบ้าน/จะรวมอยู่ในทุกเส้นทางจึงต้องมีexactคำหลักที่แตกต่างจากเส้นทางอื่น ๆ /ที่เริ่มต้นด้วย เหตุผลก็คล้ายกับ/functionsเส้นทาง หากคุณต้องการที่จะใช้เส้นทางเส้นทางอื่นเช่น/functions-detailหรือ/functions/open-doorซึ่งรวม/functionsอยู่ในนั้นแล้วคุณจะต้องใช้exactสำหรับ/functionsเส้นทาง



-1

คำตอบที่สั้นที่สุดคือ

โปรดลองสิ่งนี้

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

1
สิ่งนี้ไม่สามารถอธิบายความหมายของexactแอตทริบิวต์ / prop ได้ดังนั้นจึงไม่ใช่คำตอบ คุณควรพยายามตอบคำถามที่ถามจริงแทนที่จะให้วิธีแก้ปัญหาที่คุณไม่แน่ใจว่า OP มีจริงหรือไม่
Victor Zamanian
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.