วิธีตั้งค่า DefaultRoute เป็นเส้นทางอื่นใน React Router


100

ฉันมีสิ่งต่อไปนี้:

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

เมื่อใช้ DefaultRoute SearchDashboard จะแสดงผลไม่ถูกต้องเนื่องจากแดชบอร์ด * ใด ๆ จำเป็นต้องแสดงผลภายในแดชบอร์ด

ฉันต้องการให้ DefaultRoute ของฉันภายใน "แอป" เส้นทางชี้ไปที่เส้นทาง "searchDashboard" นี่คือสิ่งที่ฉันสามารถทำได้ด้วย React Router หรือฉันควรใช้ Javascript ปกติ (สำหรับการเปลี่ยนเส้นทางหน้า) สำหรับสิ่งนี้

โดยทั่วไปหากผู้ใช้ไปที่โฮมเพจฉันต้องการส่งไปที่แดชบอร์ดการค้นหาแทน ดังนั้นฉันเดาว่าฉันกำลังมองหาคุณสมบัติ React Router ที่เทียบเท่ากับwindow.location.replace("mygreathostname.com/#/dashboards/searchDashboard");


1
คุณได้ลองใช้ Redirect แทน DefaultRoute แล้วหรือยัง <Redirect from = "/" to = "searchDashboard" />
Jonatan Lundqvist Medén

@ JonatanLundqvistMedénนั่นคือสิ่งที่ฉันกำลังมองหาขอบคุณ! เขียนเป็นคำตอบแล้วฉันจะทำเครื่องหมายว่าถูกต้อง ขออภัยสำหรับการตอบกลับที่ล่าช้า
Matthew Herbst

คำตอบ:


156

คุณสามารถใช้ Redirect แทน DefaultRoute

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

อัปเดต 2019-08-09 เพื่อหลีกเลี่ยงปัญหาในการรีเฟรชให้ใช้สิ่งนี้แทนขอบคุณ Ogglas

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

6
เป็นแค่ฉันหรือเมื่อใช้สิ่งนี้เพื่อกด url ที่ลึกโดยตรงฉันมักจะถูกเปลี่ยนเส้นทางไปยัง URL "ถึง" แทนที่จะเป็นเส้นทางที่ฉันพยายามจะเข้า?
Pablote

ควรสังเกตว่าหากคุณกำลังทำการเปลี่ยนเส้นทางบางอย่างเช่นfrom='/a' to='/a/:id'คุณจะต้องใช้<Switch>เพื่อรวม<Redirect>และ<Route>ส่วนประกอบของคุณจาก react-router ดูรายละเอียดได้ที่doc
Kulbear

1
@ กุลแบร์ฉันมีปัญหาเดียวกัน การทำตามที่ Ogglas พูดในคำตอบของเขาได้ผล
Alan P.

2
เพื่อให้มันใช้งานได้คุณมักจะต้องวางเส้นทางนี้ให้นานที่สุดหรือทำสิ่งนี้<Redirect exact from="/" to="/adaptation" />
Aleksei Poliakov

เป็นเรื่องง่ายที่จะดูแลมันดังนั้นฉันขอย้ำ: ส่วนที่สำคัญของกฎการเปลี่ยนเส้นทางของ DarkWalker คือexactธง คำตอบที่ยอมรับหายไปดังนั้นจึงตรงกับ [เกือบ] ทุกเส้นทาง
dube

59

ปัญหาในการใช้<Redirect from="/" to="searchDashboard" />คือถ้าคุณมี URL อื่นพูด/indexDashboardและผู้ใช้กดรีเฟรชหรือได้รับ URL ที่ส่งถึงพวกเขาผู้ใช้จะถูกเปลี่ยนเส้นทาง/searchDashboardไป

หากคุณไม่ต้องการให้ผู้ใช้รีเฟรชไซต์หรือส่ง URL ให้ใช้สิ่งนี้:

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

ใช้สิ่งนี้หากsearchDashboardอยู่เบื้องหลังการเข้าสู่ระบบ:

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

37

ฉันพยายามสร้างเส้นทางเริ่มต้นอย่างไม่ถูกต้องด้วย:

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

แต่สิ่งนี้จะสร้างสองเส้นทางที่แตกต่างกันซึ่งแสดงผลคอมโพเนนต์เดียวกัน ไม่เพียง แต่จะไม่มีจุดหมายนี้ แต่มันสามารถทำให้เกิดความบกพร่องใน UI เช่นของคุณเมื่อคุณมีการจัดแต่งทรงผมองค์ประกอบอยู่บนพื้นฐานของ<Link/>this.history.isActive()

วิธีที่ถูกต้องในการสร้างเส้นทางเริ่มต้น (ซึ่งไม่ใช่เส้นทางดัชนี) คือการใช้<IndexRedirect/>:

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

สิ่งนี้ขึ้นอยู่กับ react-router 1.0.0 ดูhttps://github.com/rackt/react-router/blob/master/modules/IndexRedirect.js


อะไรคือจุดสำคัญของการมีRouteสิ่งที่คุณจัดการอยู่แล้วIndexRoute?
Matthew Herbst

1
ไม่มีประเด็นและฉันแก้ไขคำตอบของฉันเพื่อให้ชัดเจนว่าฉันไม่ได้สนับสนุนเรื่องนั้น
Seth

นี่คือสิ่งที่ฉันได้ทำเช่นกัน แต่ฉันชอบแก้ปัญหาที่ทำหน้าที่เป็นส่วนประกอบ (หน้าแรกของฉัน) ที่แทนที่จะต้องเปลี่ยนเส้นทางไปเช่น/ /home
ericsoco

ดูเหมือนว่าฉันกำลังมองหา<IndexRoute>ทุกอย่าง ขออภัยสำหรับเสียงรบกวน stackoverflow.com/questions/32706913/... github.com/reactjs/react-router/blob/master/docs/guides/...
ericsoco

11

คำตอบของโจนาธานดูเหมือนจะไม่ได้ผลสำหรับฉัน ฉันใช้ React v0.14.0 และ React Router v1.0.0-rc3 สิ่งนี้ทำ:

<IndexRoute component={Home}/>.

ดังนั้นในกรณีของ Matthew ฉันเชื่อว่าเขาต้องการ:

<IndexRoute component={SearchDashboard}/>.

ที่มา: https://github.com/rackt/react-router/blob/master/docs/guides/advanced/ComponentLifecycle.md


ขอบคุณสำหรับการแบ่งปัน ฉันใช้ React v0.13 และเวอร์ชันของ React-Router สำหรับสิ่งนั้นดังนั้นเวอร์ชันก่อน 1.0 / rc หวังว่านี่จะช่วยคนอื่น ๆ !
Matthew Herbst

ฉันคิดว่าสิ่งนี้ทำให้คุณเสียบริบท SearchDashboardจะเป็นองค์ประกอบที่คุณจะเห็นเมื่อคุณมาถึงที่หน้าแรก แต่ไม่ได้เป็นส่วนประกอบที่ห่อถ้าคุณไปDashboard /dashboard/searchDashboardReact-router จะสร้างลำดับชั้นของส่วนประกอบที่ซ้อนกันแบบไดนามิกตามเส้นทางที่ตรงกับ URL ดังนั้นฉันคิดว่าคุณจำเป็นต้องเปลี่ยนเส้นทางที่นี่จริงๆ
Stijn de Witt

7

อัปเดต : 2020

แทนที่จะใช้การเปลี่ยนเส้นทางเพียงเพิ่มหลายเส้นทางในไฟล์ path

ตัวอย่าง:

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

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

สิ่งนี้จะทำให้เมื่อคุณโหลดเซิร์ฟเวอร์บนโลคัลโฮสต์มันจะนำคุณไปยัง / บางอย่าง


3

ฉันพบปัญหาที่คล้ายกัน ฉันต้องการตัวจัดการเส้นทางเริ่มต้นหากไม่มีตัวจัดการเส้นทางที่ตรง

วิธีแก้ปัญหาของฉันคือการใช้สัญลักษณ์แทนเป็นค่าพา ธ เช่นตรวจสอบให้แน่ใจว่าเป็นรายการสุดท้ายในนิยามเส้นทางของคุณ

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

3

สำหรับผู้ที่เข้ามาในปี 2560 นี่คือโซลูชันใหม่ที่มี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>

เทียบเท่ากับอะไรDefaultRouteในreact-routerv4?
Anthony Kong

4
@AnthonyKong ฉันคิดว่ามันคือ: <Route exact path="/" component={Home}/>. reacttraining.com/react-router/web/example/basic
TYMG

1

วิธีที่แนะนำคือการใช้ส่วนประกอบIndexRoutes ของเราเตอร์แบบตอบสนอง

คุณใช้สิ่งนี้ (นำมาจากเอกสารของเราเตอร์ตอบสนองที่เชื่อมโยงด้านบน)

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

0

คุณใช้วิธีนี้เพื่อเปลี่ยนเส้นทางไปยัง URL หนึ่ง ๆ และแสดงองค์ประกอบหลังจากเปลี่ยนเส้นทางจากเราเตอร์เก่าไปยังเราเตอร์ใหม่

<Route path="/old-router">
  <Redirect exact to="/new-router"/>
  <Route path="/new-router" component={NewRouterType}/>
</Route>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.