Хорошо, так что я закончил мутировать часть своего состояния, чтобы решить эту проблему, и это на самом деле сработало очень хорошо. Сначала я сделал эти действия создателей:
export const TOGGLE_SERVER = "TOGGLE_SERVER";
export const UNTOGGLE_SERVER ="UNTOGGLE_SERVER";
export const toggleServer = (server_id) => ({
type: TOGGLE_SERVER,
server_id
});
export const unToggleServer = () => ({
type: UNTOGGLE_SERVER,
});
Затем я создал новый редуктор для своего магазина, который будет вложен в сущности (вместе с серверами, каналами, пользователями и т. Д.)
import {
TOGGLE_SERVER,
UNTOGGLE_SERVER
} from '../actions/toggle_actions';
import merge from 'lodash/merge';
const toggleReducer = (state = {}, action) => {
switch(action.type) {
case TOGGLE_SERVER:
const toggledServer = { ["serverId"]: action.server_id};
return merge({}, state, toggledServer);
case UNTOGGLE_SERVER:
const nextState = merge({}, state);
delete nextState["serverId"];
return nextState;
default:
return state;
}
};
export default toggleReducer;
const mapDispatchToProps = dispatch => ({
toggleServer: (server_id) => dispatch(toggleServer(server_id)),
unToggleServer: () => dispatch(unToggleServer()),
});
затем в server_index_item.jsx:
class ServerIndexItem extends React.Component {
constructor(props) {
super(props);
}
handleClick(server_id) {
this.props.unToggleServer();
this.props.toggleServer(server_id);
}
render() {
const { server, serverId, channelIds } = this.props;
return (
<div>
<li className="server-index-item">
<NavLink to={`/servers/${server.id}/channels`}>
<span>{server.id}</span>
<img className="discord-server-icon"
src={server.image_url}
alt={server.title} />
</NavLink>
// here its a button for now
<button onClick={() => this.handleClick(server.id)}>toggleTest</button>
<ChannelIndexContainer serverId={serverId} channelIds={channelIds} />
</li>
</div>
);
}
}
export default ServerIndexItem;
И, наконец, в своем ChannelIndex я проверил, является ли channel.server_id === activeServerId и отображать ли каналы, если это правда. Мой первый пост, поэтому я немного не уверен, что моя первоначальная проблема не была разработана должным образом, поэтому я надеюсь, что мой ответ на мой собственный вопрос (с другим решением) компенсирует это.