Допустим, у меня есть приложение React (с React Router 4) со следующими компонентами и маршрутами:
App
(/
)Toolbar
- A fixed toolbarNavButton
- A button whose appearance and behavior depends on the current route (see below)
MainMenu
- временный ящик, который выдвигается сбоку для навигации между маршрутами верхнего уровня.Admin
(/admin
)Sidenav
- A navigation drawer that is open all of the time on large screens and can be toggled on small screens. Clicking on items in theSidenav
navigates to different sub-routes under/admin
Content
(/admin/<xyz>
)
Public
(/public
)Content
Поведение NavButton
должно быть следующим:
- On a large screen:
- it should always be a hamburger icon that opens the
MainMenu
.
- it should always be a hamburger icon that opens the
- On a small screen: (except for the first condition, this is similar to the experience on the Gmail mobile app)
- if there is no
Sidenav
, it should display a hamburger icon that opens theMainMenu
. - если
Sidenav
закрыт, должен отображаться значок "Назад", открывающийSidenav
. - если
Sidenav
открыт, на нем должен отображаться значок гамбургера, открывающийMainMenu
.
- if there is no
Маршруты /admin
и /public
являются лишь примерами. Есть много других, некоторые из которых имеют Sidenav
, а некоторые нет.
У меня такой вопрос: как с помощью React можно управлять состоянием пользовательского интерфейса и соединять вместе все компоненты и маршруты? Кажется, что App
должен нести ответственность за отслеживание того, открыта ли боковая навигация, чтобы он мог передавать эту информацию Toolbar
и другим, но также кажется, что App
не должен отвечать за управление тем, потенциальных детей имеют или не имеют Sidenav
s. Кроме того, как могут быть переданы реквизиты от App
какому-то дочернему элементу, если между ними есть Route
?
Примечание: я новичок в React и, конечно же, не связан с вышеописанной структурой компонентов; это просто для иллюстрации.
NavButton
иSidenav
в «умные» компоненты, подключив их к хранилищу redux и просто реагируя на изменения вstate.isScreenBig
иstate.isSidenavActive
. Но это кажется неряшливым. Кроме того, он не распространяется на случай, когдаstate.isSidenavActive === true
и пользователь переходит от/admin
к/public
. Кто отвечает за возвратstate.isSidenavActive
кfalse
? - person ethan.roday   schedule 23.06.2017