2015-10-13 20 views
7

Tôi muốn kết xuất thành phần dựa trên điều kiện bên ngoài, chuyển hướng khác đến nơi khác trong ứng dụng.Giai đoạn vòng đời thích hợp để thực hiện chuyển hướng trong một thành phần React là gì?

Lý tưởng nhất là chuyển hướng này sẽ được quyết định trước thành phần, nhưng trong một số trường hợp, tôi cảm thấy mình cần phải làm điều này trong cấu phần. Ví dụ, trong ReactRouter, router có thể trông như thế này:

<Router> 
    <Route path='/' component={LoadingPage} /> 
    <Route path='/Home' component={HomePage} /> 
    <Route path='/Login' component={LoginPage} /> 
</Router> 

và logic/sudocode cho LoadingPage sẽ đi một cái gì đó như thế này:

if (stillLoading) { 
    render 
} else if (loggedIn) { 
    redirectToHome 
} else { 
    redirectToLogin 
} 

Nó trở nên phức tạp, bởi vì đôi khi ứng dụng được đã được tải trước khi thành phần được yêu cầu.

Giai đoạn vòng đời nào là nơi thích hợp nhất để đặt logic chuyển hướng này?

  • Hiển thị/phương thức được gọi từ Render? (có vẻ lạ)
  • ComponentDidMount + Tạo trình xử lý sự kiện cho sau này?
  • GetInitialState? (nhưng không nên có tác dụng phụ?)
  • ComponentWillMount?
  • Khác?
+1

kiểm tra 'onEnter' trong tài liệu Bộ định tuyến phản ứng và ví dụ về dòng xác thực trong repo – knowbody

+0

@knowbody - tuyệt vời! Đó chính xác là những gì tôi đang tìm kiếm. Vì vậy, câu trả lời thực sự là null - làm chuyển hướng trước khi các thành phần thậm chí bắt đầu – eedrah

Trả lời

5

Tôi có một ứng dụng tương tự và tôi áp dụng mẫu thông lượng. Tôi tạo một loginStore để lưu trạng thái đăng nhập và các trang khác xem nó. Tôi sử dụng higher order component để xem các thay đổi của cửa hàng, vì vậy trạng thái tải được chuyển vào các thành phần khác thông qua props. Sau đó, tôi chuyển đổi trang trong componentWillReceiveProps.

Nếu bạn không áp dụng mẫu thông lượng, tôi nghĩ bạn phải quyết định cách biết điều kiện bên ngoài trước tiên. Ví dụ: đặt logic trong componentWillReceiveProps nếu điều kiện bên ngoài đến từ props.

Không đặt logic chuyển hướng trong kết xuất phải là pure. Mỗi khi bạn gọi phương thức render, nó chỉ trả về mô tả của DOM thay vì chuyển đổi trang của bạn.

ComponentWillMount cũng không hoạt động. Nó chỉ được gọi một lần và có thể được gọi trước khi bạn đăng nhập. GetInitialState cũng có vấn đề này, và nó chỉ nên cung cấp trạng thái ban đầu của thành phần của bạn.

+0

Bạn đề nghị gì nếu đạo cụ của tôi đến từ trạng thái Redux của tôi? Và tôi muốn kiểm tra nếu 'this.props.match.params.lockId' có' lock._id' tương ứng. Nếu không, tôi muốn chuyển hướng về '/'. –

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