Cмотря как хотите реализовать. Если хотите открывать на той же странице, то достаточно хандлера, ключа состояния и условия в
render:
class Example extends Component {
state = {
eventsList,
selectedEvent,
};
handleSelectEvent(event) {
this.setState({ selectedEvent: event });
}
render() {
const { eventsList, selectedEvent } = this.state;
return (
<Wrapper>
{selectedEvent && <EventDetails event={selectedEvent} />}
<ul>
{eventsList.map(event => (
<li
key={event.id}
onClick={() => this.handleSelectEvent(event)}
>
{event.name}
</li>
))}
</ul>
</Wrapper>
);
}
}
Если хотите на отдельной странице, то лучше использовать
роутер.
В примере ниже используются компоненты
BrowserRouter,
Switch,
Route,
Link из пакета
react-router-dom.
Приложение оборачиваете в
BrowserRouter:
<BrowserRouter>
<App />
</BrowserRouter>
В том месте где хотите рендерить роуты:
<Switch>
<Route exact path="/" component={Home} />
<Route path="/events" component={EventsList} />
<Route path="/event/:id" component={EventDetails} />
</Switch>
В компоненте списка:
class EventsList extends Component {
state = {
eventsList,
};
render() {
const { eventsList } = this.state;
return (
<Wrapper>
<ul>
{eventsList.map(event => (
<li key={event.id}>
<Link to={`/event/${event.id}`}>{event.name}</Link>
</li>
))}
</ul>
</Wrapper>
);
}
}
В компоненте детализации, в зависимости откуда получаете элементы реализация может отличаться,
но id элемента можно получить из параметров ссылки так:
class EventsList extends Component {
componentDidMount() {
const elementId = this.props.match.params.id;
}
render() {
...
}
}