2014-12-23 40 views
27

Tôi đang thiết lập một số tuyến đường lồng nhau trong React-Router (v0.11.6 là những gì tôi đang làm việc), nhưng bất cứ khi nào tôi thử và truy cập một trong các tuyến đường lồng nhau, nó kích hoạt tuyến đường mẹ.Đường lồng nhau trong phản ứng-router

tuyến đường của tôi trông như thế này:

<Route handler={App}> 
    <Route name="home" path="/" handler={availableRoutes.Splash} /> 
    <DefaultRoute handler={availableRoutes.Splash} /> 

    <Route name="dashboard" handler={availableRoutes.Dashboard}> 
     <Route name="dashboard-child" handler={availableRoutes.DashboardChild} /> 
    </Route> 

    <NotFoundRoute handler={NotFound} /> 
</Route> 

Nếu tôi sụp đổ các tuyến đường lên để nó trông giống như:

<Route handler={App}> 
    <Route name="home" path="/" handler={availableRoutes.Splash} /> 
    <DefaultRoute handler={availableRoutes.Splash} /> 

    <Route name="dashboard" handler={availableRoutes.Dashboard} /> 
    <Route name="dashboard-child" path="/dashboard/dashboard-child" handler={availableRoutes.DashboardChild} /> 

    <NotFoundRoute handler={NotFound} /> 
</Route> 

Nó hoạt động tốt. Lý do tôi làm tổ là bởi vì tôi sẽ có nhiều trẻ em dưới "bảng điều khiển" và muốn tất cả chúng được bắt đầu bằng số dashboard trong URL.

Trả lời

41

Cấu hình không phải là về định tuyến (mặc dù tên) nhưng nhiều hơn về bố cục được điều khiển bởi đường dẫn.

Như vậy, với cấu hình này:

<Route name="dashboard" handler={availableRoutes.Dashboard}> 
    <Route name="dashboard-child" handler={availableRoutes.DashboardChild} /> 
</Route> 

Người ta nói rằng dashboard-child là được nhúng bên trong dashboard. Cách làm việc này là nếu dashboard có một cái gì đó như thế này:

<div><h1>Dashboard</h1><RouteHandler /></div> 

dashboard-child có:

<h2>I'm a child of dashboard.</h2> 

Sau đó cho đường dẫn dashboard không có con nhúng do không có con đường phù hợp, dẫn đến điều này:

<div><h1>Dashboard</h1></div> 

Và đối với đường dẫn dashboard/dashboard-child con được nhúng có đường dẫn phù hợp, dẫn đến điều này :

<div><h1>Dashboard</h1><h2>I'm a child of dashboard.</h2></div> 
+1

@bjfletcher, bạn có thể làm rõ, làm thế nào các tuyến đường và bố trí nên xem xét nếu tôi có ví dụ như: Bố cục 3 cấp độ sâu và khi tôi chuyển đổi giữa các bộ định tuyến cấp 3 thì thành phần phụ cấp 2 không được hiển thị lại. –

+1

@MihailZheludev Tuyệt đối. Đây là cách dễ dàng để tìm hiểu: sửa đổi một số văn bản trong thành phần gốc đó. Sau đó chơi với thành phần cấp 3. Sửa đổi sẽ vẫn còn và không được hiển thị lại. – bjfletcher

+0

@bjfletcher, tôi hiểu nó, nhưng tôi có vấn đề như tôi đã mô tả ở trên.Tôi có 2 cấp độ và tất cả các ứng dụng từ phần tử gốc đến đứa trẻ cuối cùng đang được hiển thị cho mọi chuyển đổi cho trẻ –

0

Tôi gặp sự cố tương tự. Tôi nghĩ rằng đoạn mã sau có thể phù hợp với bạn:

... 
<Route name="dashboard"> 
    <Route path="/" handler={availableRoutes.Dashboard}/> 
    <Route name="dashboard-child" path="dashboard-child" handler={availableRoutes.DashboardChild}/> 

    <DefaultRoute handler={availableRoutes.Dashboard}/> 
</Route> 
... 
13

Đây là bản cập nhật cho câu trả lời của @ bjfletcher cho bộ phản ứng-bộ định tuyến 1.0.0. Như đã lưu ý trong số upgrade guide:

RouteHandler đã biến mất. Router giờ sẽ tự động điền this.props.children thành phần của bạn dựa trên tuyến đường đang hoạt động.

Vì vậy, thay vì

<div><h1>Dashboard</h1><RouteHandler /></div>

bạn sẽ sử dụng:

<div><h1>Dashboard</h1>{this.props.children}</div>

+5

Nếu bạn chỉ muốn các tuyến đường lồng nhau trong url nhưng muốn '{this.props.children này } 'làm thành phần duy nhất? – walkerrandophsmith

+0

một giải pháp tôi tìm thấy là để contol nó trong thành phần cha, tại hàm render, với một đoạn mã như: 'if (this.props.children) return (this.props.children);' – tbo

Các vấn đề liên quan