多くの場合に発生させたいグローバル ビュー (読み込み画面の表示など) がある場合、その動作に対してアクション クリエーター/アクションのペアを作成するか、関連するアクションのリデューサーを作成する方が適切ですか?移行を処理しますか?
これを簡潔に説明するのは難しいので、例をいくつか示します。どちらが優れていますか、なぜですか?
あ
function showLoading () {
return 'SHOW_LOADING';
}
function hideLoading () {
return 'HIDE_LOADING';
}
function fetchPostsRequest () {
return 'FETCH_POSTS_REQUEST';
}
function fetchPostsSuccess () {
return 'FETCH_POSTS_SUCCESS';
}
function doSomethingAsync () {
return dispatch => {
dispatch(showLoading());
dispatch(fetchPostsRequest());
// other logic
dispatch(hideLoading())
dispatch(fetchPostsSuccess());
}
}
function rootReducer (state = {}, action) {
const payload = action.payload;
switch(action) {
case 'SHOW_LOADING':
Object.assign({}, state, {isLoading: true})
break;
case 'HIDE_LOADING':
Object.assign({}, state, {isLoading: false})
break;
// other reducers for handling success/request stuff
}
}
B
function fetchPostsRequest () {
return 'FETCH_POSTS_REQUEST';
}
function fetchPostsSuccess () {
return 'FETCH_POSTS_SUCCESS';
}
function fetchPostsFailure () {
return 'FETCH_POSTS_FAILURE';
}
function doSomethingAsync () {
return dispatch => {
dispatch(fetchPostsRequest());
// good
dispatch(fetchPostsSuccess());
// bad
dispatch(fetchPostsFailure());
}
}
function rootReducer (state = {}, action) {
const payload = action.payload;
switch(action) {
case 'FETCH_POSTS_REQUEST':
Object.assign({}, state, {isLoading: true})
break;
case 'FETCH_POSTS_SUCCESS':
Object.assign({}, state, {isLoading: false /* other logic */})
break;
case 'FETCH_POSTS_FAILURE':
Object.assign({}, state, {isLoading: false /* other logic */})
break;
}
}
状態管理のロジックを複製するよりも、これらの動作を 1 か所で説明する方が賢明だと思われるため、私は A を好みますが、redux コミュニティでは、アクションは必須ではなく、何が起こったか、または起こっているかを説明するべきであるという格言を聞いたことがあります。コマンド。どの場合、「ASYNC_OPERATION_START」のような用語が「SHOW_LOADING」よりも優れているという意味上の問題ですか?