Nếu bạn muốn có khái niệm về "lỗi toàn cục", bạn có thể tạo một trình errors
giảm thiểu, có thể lắng nghe các hành động addError, removeError, v.v. Sau đó, bạn có thể kết nối vào cây trạng thái Redux của mình tại state.errors
và hiển thị chúng ở bất kỳ nơi nào thích hợp.
Có một số cách bạn có thể tiếp cận vấn đề này, nhưng ý tưởng chung là các lỗi / thông báo toàn cục sẽ có ích cho việc giảm thiểu của riêng chúng để hoàn toàn tách biệt với <Clients />
/ <AppToolbar />
. Tất nhiên nếu một trong hai thành phần này cần quyền truy cập, errors
bạn có thể chuyển errors
cho chúng như một chỗ dựa bất cứ khi nào cần thiết.
Cập nhật: Ví dụ về mã
Dưới đây là một ví dụ về nó có thể trông như thế nào nếu bạn chuyển "lỗi chung" errors
vào cấp cao nhất của mình <App />
và hiển thị nó có điều kiện (nếu có lỗi). Sử dụng react-reduxconnect
để kết nối <App />
thành phần của bạn với một số dữ liệu.
// App.js
// Display "global errors" when they are present
function App({errors}) {
return (
<div>
{errors &&
<UserErrors errors={errors} />
}
<AppToolbar />
<Clients />
</div>
)
}
// Hook up App to be a container (react-redux)
export default connect(
state => ({
errors: state.errors,
})
)(App);
Và theo như người tạo hành động có liên quan, nó sẽ gửi ( redux-thunk ) thất bại thành công theo phản hồi
export function fetchSomeResources() {
return dispatch => {
// Async action is starting...
dispatch({type: FETCH_RESOURCES});
someHttpClient.get('/resources')
// Async action succeeded...
.then(res => {
dispatch({type: FETCH_RESOURCES_SUCCESS, data: res.body});
})
// Async action failed...
.catch(err => {
// Dispatch specific "some resources failed" if needed...
dispatch({type: FETCH_RESOURCES_FAIL});
// Dispatch the generic "global errors" action
// This is what makes its way into state.errors
dispatch({type: ADD_ERROR, error: err});
});
};
}
Mặc dù trình giảm thiểu của bạn có thể đơn giản quản lý một loạt lỗi, thêm / bớt các mục nhập một cách thích hợp.
function errors(state = [], action) {
switch (action.type) {
case ADD_ERROR:
return state.concat([action.error]);
case REMOVE_ERROR:
return state.filter((error, i) => i !== action.index);
default:
return state;
}
}