Да, структура папок работает хорошо. Что касается функциональности «выборка» или «служба», о которой вы говорите, я приведу вам пример того, что должны делать действия и редукторы в базовом примере.
Так что, если вы работаете с бэкэндом, из которого вы «извлекаете» что-либо, я бы рекомендовал добавить эту функциональность в действие, а не редуктор:
import { USERS_FETCHED } from '../constants/actionTypes';
import { baseUrl } from "../constants/baseUrl";
const usersFetched = users => ( { // action to dispatch
type: USERS_FETCHED,
users,
} );
export const fetchUsers = () => ( dispatch ) => { // export for mapDispatchToProps
request( `${ baseUrl }/users` )
.then( response => {
dispatch( usersFetched( response.body ) ); // dispatch the action to reducer
} )
.catch( console.error );
}; // in your case you import createUser(), but it works either way
Теперь действие касается функциональности, в отличие от редуктора, касающегося только управления состоянием Redux:
import { USERS_FETCHED } from "../constants/actionTypes";
export default ( state = null, action = {} ) => {
switch ( action.type ) {
case USERS_FETCHED:
return action.users;
default:
return state;
}
};
Функциональность редуктора в порядке, но она должна касаться только управления состоянием. Вы можете себе представить, насколько беспорядочным может быть код, если вы начнете получать какие-либо данные здесь, не говоря уже о проблемах с асинхронностью. Конечно, это всего лишь один из способов сделать это, но он работает надежно. Надеюсь, это вам как-то поможет.