2017-04-06 15 views
12

Tôi đã thấy các câu trả lời xung đột (hoặc chỉ gây nhầm lẫn với tôi) trong các câu hỏi khác ở đây về việc sử dụng getState trong một hành động có được chấp nhận hay không và tôi đã thấy khá nhiều lần nó được gọi là chống mẫu. Đối với tôi, nó có vẻ hoạt động tốt nhưng thực hành tốt nhất để làm điều này là gì nếu chúng ta không sử dụng getState?Có sử dụng getState trong thực hành tốt Redux Thunk không?

Tôi đang sử dụng getState trong một đoạn để lọc qua một mảng người dùng hiện đang kết nối với một số dữ liệu giả và bị kéo vào trạng thái của ứng dụng.

Đây là mã cho hành động của tôi:

export const accountLogInSuccess = user => ({ 
    type: types.ACCOUNT_LOG_IN_SUCCESS, 
    user, 
}); 

export const accountLogOutSuccess =() => ({ 
    type: types.ACCOUNT_LOG_OUT_SUCCESS, 
}); 

export const accountCheckSuccess =() => ({ 
    type: types.ACCOUNT_CHECK_SUCCESS, 
}); 

export const accountCheck =() => (
    (dispatch, getState) => { 
     dispatch(ajaxCallBegin()); 
     return apiAccount.accountCheck().then((account) => { 
      if (account) { 
       const user = findByUID(getState().users, account.uid); 
       dispatch(accountLogInSuccess(user)); 
       toastr.success(`Welcome ${user.nameFirst}!`); 
      } else { 
       dispatch(accountLogOutSuccess()); 
      } 
      dispatch(accountCheckSuccess()); 
     }).catch((error) => { 
      dispatch(ajaxCallError(error)); 
      toastr.error(error.message); 
      throw (error); 
     }); 
    } 
); 

Và giảm tốc của tôi:

export default function reducerAccount(state = initial.account, action) { 
    switch (action.type) { 
    case types.ACCOUNT_LOG_IN_SUCCESS: 
     return Object.assign({}, state, action.user, { 
      authenticated: true, 
     }); 
    case types.ACCOUNT_LOG_OUT_SUCCESS: 
     return Object.assign({}, { 
      authenticated: false, 
     }); 
    case types.ACCOUNT_CHECK_SUCCESS: 
     return Object.assign({}, state, { 
      initialized: true, 
     }); 
    default: 
     return state; 
    } 
} 

Các trạng thái ban đầu của tài khoản được sử dụng trong giảm tốc của tôi chỉ là:

account: { 
    initialized: false, 
    authenticated: false, 
}, 

Các Hành động accountCheck chuyển người dùng (được tìm thấy bằng cách sử dụng getState vàChức năng) vào accountLogInSuccess trong đó bộ giảm thêm giá trị của nó vào trạng thái hiện tại của tài khoản qua Object.assign.

Không muốn đưa người dùng vào thư mục gốc của ứng dụng và sau đó chuyển nó xuống qua đạo cụ, cách tốt nhất để thực hiện điều này trong Redux và dữ liệu người dùng có sẵn ở trạng thái là gì? Một lần nữa, bằng cách sử dụng getState trong thunk hoạt động tuyệt vời cho tôi cho đến nay, nhưng có một giải pháp tốt hơn cho điều này mà không được coi là một mô hình chống?

Trả lời

12

Tôi đã viết một bài đăng blog mở rộng có tên là Idiomatic Redux: Thoughts on Thunks, Sagas, Abstraction, and Reusability, địa chỉ này chủ đề cụ thể. Trong đó, tôi trả lời một vài lời phê phán về những đoạn và sử dụng getState (bao gồm cả những bình luận của Dan Abramov ở số Accessing Redux state in an action creator?). Trên thực tế, bài đăng của tôi được lấy cảm hứng từ các câu hỏi như của bạn.

Là TL, DR của bài đăng của tôi: Tôi tin rằng khối là công cụ hoàn toàn khả thi để sử dụng trong các ứng dụng Redux và khuyến khích sử dụng chúng. Trong khi có một số mối quan tâm hợp lệ cần lưu ý khi sử dụng các đoạn và sagas, và sử dụng getState/select bên trong chúng, những mối quan ngại này sẽ không khiến bạn sợ hãi khi sử dụng các khối.

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