Теория:
по щелчку = по действию от пользователя = экшен
изменить данные в сторе = прокинуть через reducer.
Далее, раз у вас есть вариант показывать/скрывать дропдаун, то можно это состояние спокойно хранить в state компонента-представления, ибо флаг: показано/скрыто вряд ли нужен другим вашим компонентам.
Итого: получаем данные от севера, кладем их в соответствующий редьюсер, по щелчку изменяем стейт компонента и показываем/скрываем список, по клику в списке (если такое нужно) - отправляем экшен, который улетает на сервер, и, допустим, сохраняет измененную инфу о юзере - приходит ответ - вы далее сами решаете, класть этот ответ снова в reducer и как-то заставлять на это реагировать UI или нет.
Когда идет речь, об "отправляем экшен" - это значит из компонента-представления мы вызываем метод (через функцию переданную в качестве пропса) родителя, то есть компоненета-контейнера. В контейнере этот метод должен в итоге вызывать (или сразу быть так передан) "приконекченный" вызов ( внутри функции connect, в качестве аргумента mapDispatchToProps). Если совсем "в наглую делать" для теста, то это store.dispatch.ACTION_CREATOR_NAME
const UserContainer = connect(
state => ({
default_role: state.customerProject.default_role,
show_role: state.customerProject.show_role,
roles_user: state.customerProject.roles_user
}),
dispatch => ({
anyName: () => dispatch(myActionCreator()) // и затем this.props.myNewActionCreator нужно передать в компонент-представление. Если нужно сделать доп-обработку, то передать метод из контейнера, в котором будет сначала обработка, а потом вызов this.props.myNewActionCreator
}))(AboutUser)
...
const changeRoleUser = () => {
this.props.anyName()
}
...