2016-02-29 19 views
28

Tôi đang sử dụng phản ứng-redux và phản hồi định tuyến chuẩn. Tôi cần chuyển hướng sau hành động nhất định.Phản hồi chuyển hướng bộ định tuyến sau khi thực hiện redux

Ví dụ: Tôi đã đăng ký một vài bước. Và sau khi hành động:

function registerStep1Success(object) { 
    return { 
     type: REGISTER_STEP1_SUCCESS, 
     status: object.status 
    }; 
} 

Tôi muốn anh chuyển hướng đến trang có đăng kýStep2. Làm thế nào để làm nó?

p.s. Trong trình duyệt lịch sử '/ registrationStep2' chưa bao giờ được. Trang này chỉ xuất hiện sau khi đăng ký thành công trang đăng ký thành công.

Trả lời

36

Với Phản ứng Router 2+, mọi lúc mọi nơi cử hành động, bạn có thể gọi browserHistory.push() (hoặc hashHistory.push() nếu đó là những gì bạn sử dụng):

import { browserHistory } from 'react-router' 

// ... 
this.props.dispatch(registerStep1Success()) 
browserHistory.push('/registrationStep2') 

Bạn có thể làm điều này từ người sáng tạo hành động async quá nếu đó là những gì bạn sử dụng.

+0

những lợi ích gì khi sử dụng bộ định tuyến redux trong tương lai, hiện đang ở giai đoạn beta? – ximet

+4

Nếu bạn muốn có các chuyển tiếp định tuyến lại Redux DevTools, bạn cần chọn giữa https://github.com/acdlite/redux-router và https://github.com/reactjs/react-router-redux. Trong trường hợp này tôi sẽ giới thiệu https://github.com/reactjs/react-router-redux vì nó ổn định hơn và đơn giản hơn nhiều. –

+0

@DanAbramov cách chúng tôi có thể thực hiện chuyển hướng sau một hành động như ximet đang yêu cầu? đó là chính xác để làm một "đẩy" trong bộ giảm xử lý REGISTER_STEP1_SUCCESS? –

14

Bạn đã xem react-router-redux chưa? Thư viện này làm cho nó có thể đồng bộ hóa phản ứng-router với redux.

Dưới đây là ví dụ từ tài liệu về cách bạn có thể triển khai chuyển hướng bằng hành động đẩy từ phản ứng-bộ định tuyến-redux.

import { routerMiddleware, push } from 'react-router-redux' 

// Apply the middleware to the store 
const middleware = routerMiddleware(browserHistory) 
const store = createStore(
    reducers, 
    applyMiddleware(middleware) 
) 

// Dispatch from anywhere like normal. 
store.dispatch(push('/foo')) 
+0

Tôi biết về định tuyến. Nhưng, tôi tự hỏi là nó có thể sử dụng tiêu chuẩn phản ứng-định tuyến – ximet

+13

Và làm thế nào chuyển hướng trên trang khác sau khi hành động (bằng cách sử dụng phản ứng-router-redux).? – ximet

+0

Bạn có thể truy cập cửa hàng bên trong bộ giảm tốc không? – Ante

2

Để xây dựng trên Eni Arinde câu trả lời trước của (Tôi không có danh tiếng để bình luận), đây là làm thế nào để sử dụng phương pháp store.dispatch sau khi một hành động async:

export function myAction(data) { 
    return (dispatch) => { 
     dispatch({ 
      type: ACTION_TYPE, 
      data, 
     }).then((response) => { 
      dispatch(push('/my_url')); 
     }); 
    }; 
} 

Bí quyết là để làm điều đó trong các tập tin hành động và không phải trong bộ giảm tốc, kể từ khi bộ giảm tốc không nên có tác dụng phụ.

+0

Ngay cả khi giải pháp này hoạt động, các hành động không nên biết về định tuyến tại tất cả IMO. Bạn sẽ có thể gửi một hành động mà không cần bất kỳ định tuyến nào. – wintercounter

+0

Đây có phải là cách phù hợp để tiếp cận sự cố không? Chúng ta có nên truyền đối tượng lịch sử từ thành phần đến người tạo hành động để định tuyến không? –

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