Во-первых, вы можете взглянуть на реагирующий маршрутизатор / one, например https://reactrouter.com/web/guides/quick-start
Однако, поскольку вы пишете, что вы новичок в реакции, это может быть многовато ...
Во-первых, мне было интересно, почему вы используете "ReactDOM" в своем индексе js (это кажется правильным), но также и в BookStore. js . Я также рекомендовал бы писать ваши компоненты как функции, такие как ваш «AppContainer», и больше не использовать компоненты класса (или вам действительно нужно это делать? - почему?). Вместо этого вы можете использовать хуки, чтобы иметь, например, состояние в компонентах.
В этом случае вам понадобится любое состояние в вашем AppContainer, которое используется для маршрутизации. Может быть, вот так:
const AppContainer = () => {
const [showDetail, setShowDetail] = useState();
return <>
{!showDetail && <BookStore onDetail={detail => setShowDetail(detail)} />}
{showDetail && <DetailPage detail={showDetail} onBack={() => setShowDetail(undefined)}}
</>
}
После этого ваш AppContainer имеет состояние, следует ли показывать книжный магазин (что отображается, когда "showDetail" является ложным, или DetailPage, которая отображается, если showDetail является правдивым.
Чтобы это работало, ваш книжный магазин должен обеспечивать обратные вызовы, чтобы AppContainer знал, что что-то должно измениться. Очень просто это могло бы выглядеть так:
const BookStore = ({onDetail}) => {
return <button onClick={() => onDetail("anything")}>Click me</button>
}
Теперь, когда кто-то нажимает кнопку на bookstore, он вызывает обратный вызов onDetail, который был установлен в AppContainer для установки состояния showDetail. Таким образом, в этом случае он будет обновлен на «что угодно». Это приведет к повторной визуализации в AppContainer, которая теперь будет вместо этого отобразить компонент DetailPage.