2015-10-24 56 views
19

Tôi đang cố xác thực thông tin đăng nhập. Sau khi đảm bảo đăng nhập hợp lệ, tôi muốn kích hoạt tuyến đường mới. Tôi chuyển state.loginReducer.login làm đạo cụ. Khi tôi xử lý sự kiện gửi, một hành động được gửi đi, thay đổi trạng thái đăng nhập toàn cục.Cập nhật trạng thái Redux không kích hoạt thành phầnWillReceiveProps

Không nên ComponentWillReceiveProps được kích hoạt trong trường hợp này? kể từ khi đạo cụ thay đổi ?. Có cách nào tốt hơn để triển khai chức năng này không?

handleSubmit (evt) { 
    const { 
     dispatch, 
     login 
    } = this.props; 

    dispatch(actions.doLogin(value.login)); 
} 

ComponentWillReceiveProps (nextprops) { 
    const { 
     login 
    } = this.nextProps; 

    if (login != null) { 
     history.pushState({}, '/account'); 
    } 
} 

function mapStateToProps (state) { 
    return { 
     login: state.loginReducer.login 
    } 
} 

export default connect(mapStateToProps)(Login); 
+0

Giải pháp rõ ràng sẽ sử dụng gọi lại (đó là những gì tôi đang làm ngay bây giờ), nhưng tôi vẫn không chắc chắn về CWRP không bị sa thải trong trường hợp này. –

+0

Bạn có định nghĩa 'mapStateToProps' làm phương thức lớp không? Hãy chắc chắn rằng bạn không vô tình truyền trong 'undefined' để kết nối. –

Trả lời

26

Nếu state.loginReducer.login thay đổi, sau đó componentWillReceiveProps sẽ được kích hoạt. Nếu bạn tin rằng trình giảm tốc của bạn đang trả lại trạng thái mới và componentWillReceiveProps không được kích hoạt, hãy đảm bảo rằng trạng thái mới là không thay đổi. Việc trả về cùng một tham chiếu trạng thái được truyền cho bộ giảm tốc sẽ không hoạt động.

Từ http://rackt.org/redux/docs/Troubleshooting.html:

này là sai:

function todos(state = [], action) { 
    switch (action.type) { 
    case 'ADD_TODO': 
    // Wrong! This mutates state 
    state.push({ 
     text: action.text, 
     completed: false 
    }); 
    case 'COMPLETE_TODO': 
    // Wrong! This mutates state[action.index]. 
    state[action.index].completed = true; 
    } 

    return state; 
} 

này là đúng:

function todos(state = [], action) { 
    switch (action.type) { 
    case 'ADD_TODO': 
    // Return a new array 
    return [...state, { 
     text: action.text, 
     completed: false 
    }]; 
    case 'COMPLETE_TODO': 
    // Return a new array 
    return [ 
     ...state.slice(0, action.index), 
     // Copy the object before mutating 
     Object.assign({}, state[action.index], { 
     completed: true 
     }), 
     ...state.slice(action.index + 1) 
    ]; 
    default: 
    return state; 
    } 
} 
+0

https://gist.github.com/lslima91/19e3d992a086d2baf3b2 đây là trình giảm tốc đăng nhập của tôi –

+2

Điều này đã chết. Trong trường hợp của tôi, vấn đề là tôi đã làm điều này - 'return Object.assign (state, {key: newValue});' - thay vì điều này - 'return Object.assign ({}, state, {key: newValue }); '. Bí quyết ở đây là bắt đầu 'Object.assign' với đối tượng cũ được cập nhật đối tượng THAT, trái với việc trả về một cái gì đó mới, vì vậy Redux dường như đã nghĩ rằng không có gì thay đổi, mặc dù dữ liệu của đối tượng đã làm (tương tự). – Sasha

+1

@Sasha cảm ơn, nhận xét của bạn thực sự đã giúp tôi. Tôi đã tạo một đối tượng mới với cùng một khóa. Một trong các khóa có chứa một mảng bị đột biến, nhưng thực sự là một tham chiếu đến một mảng cũ từ trạng thái trước đó. – rnli

7

ComponentWillReceiveProps (nextprops) nên componentWillReceiveProps (nextprops)

Chữ 'C' phải thấp hơn. Trên thực tế, mapStateToProps kích hoạt componentWillReceiveProps. Tôi chắc chắn về việc đó.

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