На самом деле я не вижу причин для рефакторинга вашего кода: вы не изменяете входные данные и используете if
для условного возврата выходных данных.
О rootReducer(undefined, action)
, я считаю, что вы должны использоватьдеструктуризация параметров:
const rootReducer = ({ state, action } = {}} => {
// Stuff here
}
То есть вы можете указать либо state
, либо action
, либо и то и другое:
const makeReducer = ({ state, action }) => {
if (action.type === LOG_OUT) {
return rootReducer({ action })
}
return rootReducer({ state, action })
}
Кроме того, рассмотрите возможность использования троицы для решения простых случаев:
const makeReducer = ({ state, action }) =>
rootReducer( action.type === LOG_OUT ? { action } : { state, action } )
Наконец, может быть еще один подход с использованием теговых сумм и сгибов.Поскольку я не работаю с React и / или Redux , я не знаю, можно ли использовать этот подход, но я считаю, что все еще интересно, что вы обнаружили это альтернативное решение:
const tag = Symbol ( 'tag' )
// TaggedSum
const Action = {
logout: value => ( { [tag]: 'logout', value } ),
login: value => ( { [tag]: 'login', value } )
}
const foldAction = matches => action => {
const actionTag = action[ tag ]
const match = matches [ actionTag ]
return match ( action.value )
}
const state = { x: 1 }
const LOG_IN = 1
const LOG_OUT = 2
const logout = Action.logout ( { action: LOG_OUT, state } )
const login = Action.login ( { action: LOG_IN, state } )
const rootReducer = args => console.log ( args )
// Pattern matching
const matchAction = {
logout: ( { state } ) => rootReducer( { state } ),
login: rootReducer
}
const foldAction_ = foldAction( matchAction )
foldAction_ ( logout )
foldAction_ ( login )