Вот как бы я это сделал. Вместо того, чтобы отправлять уникальное действие для каждого типа кнопки, например MENU_BTN
, SEARCH_BTN
и т. Д., Я бы отправил { type: 'TOGGLE_BUTTON', payload: 'menu' }
и в редукторе
case TOGGLE_BUTTON:
return {
[payload]: !state[payload]
...state
}
Затем вы можете переключать кнопки, как это
const toggleButton = key => ({
type: 'TOGGLE_BUTTON',
payload: key
})
dispatch(toggleButton('menu'))
dispatch(toggleButton('search'))
Таким образом, вы можете отслеживать столько кнопок, сколько захотите. Ваше состояние будет выглядеть примерно так
...
buttons: {
menu: true,
search: false
}
...
и вы можете легко написать селектор для каждой кнопки
// Component displaying state of menu button //
let MyComponent = ({ menuButtonState }) => (
<div>
Menu button is {menuButtonState ? 'on' : 'off'}
</div>
)
// Helper function for creating selectors //
const createGetIsButtonToggledSelector = key => state => !!state.buttons[key]
// Selector getting state of a menu button from store //
const getIsMenuButtonToggled = createGetIsButtonToggledSelector('menu')
// Connecting MyComponent to menu button state //
MyComponent = connect(state => ({
menuButtonState: getIsMenuButtonToggled(state)
})(MyComponent)