Рендеринг одних и тех же дочерних элементов в нескольких узлах-братьях
Вопрос задает вопрос "как передать набор реагирующих узлов". В идеале нет. Если вы визуализируете узлы где-то в вашей иерархии с намерением использовать их в другом месте , возможно, вы используете неправильную стратегию.
Если вам нужно визуализировать одни и те же компоненты в разных местах, создайте функцию, которая визуализирует компоненты, и вызовите ее из обоих мест. Другими словами, всегда передает информацию, а не отображаемые элементы .
Визуализация внутри маршрутизатора
В типичном одностраничном приложении Маршрутизатор отобразит все компоненты (не статичные c). Вот как пример должен был это сделать. Компонент маршрутизации (LayoutContent
) должен был отвечать за непосредственное отображение «пройденных узлов» (SecondaryMenu
).
<Route path="/page1">
<Page title="Page 1 - With secondary menu">
<SecondaryMenu id="menu1"> {/* <- use SecondaryMenu instead of SecondaryMenuItems */}
<li>Page 1 item 1</li>
<li>Page 1 item 2</li>
</SecondaryMenu> {/* <- use SecondaryMenu instead of SecondaryMenuItems */}
</Page>
</Route>
Когда рендеринг внутри маршрутизатора невозможен
Если по какой-то причине компонент маршрутизации не может визуализировать контент напрямую, то решение для одностраничного приложения (или маршрутизации), вероятно, является неправильным решением. Вот. Вопрос не содержит никакой информации о том, почему компоненты не могут быть отображены внутри маршрутизатора, смело редактируйте вопрос и комментируйте с дополнительной информацией.
Другой способ достижения этого примера - это не быть компонентом маршрутизации (т. е. не LayoutContent
) и SecondaryMenu
проверять путь страницы и условно отображать соответствующий контент на основе этого. Может показаться глупым вручную выполнять условную визуализацию на основе пути, когда есть компонент маршрутизатора, который делает это за вас, и я бы согласился. Решение состоит в том, чтобы вообще не использовать маршрутизатор. Попытка отобразить детей в роутере и передать их имеет сильный запах кода.
В иерархической структуре React, если требуется одна и та же информация, принимайте решения о рендеринге в нескольких местах (в данном случае это путь), переместите эту информацию до ближайшего родителя всех компонентов и передайте ее как подпорки. или как контекст.
Предотвращение столкновений идентификаторов
«Что если я использую дублированный идентификатор для вторичных меню?»
Если вы вызываете функцию для рендеринга вторичного меню вместо его рендеринга и передачи это, тогда вы можете передать префикс меню в подпорках и использовать этот префикс меню в функции.
function SecondaryMenuItems({ children, idPrefix, path }) {
if (path == '/path1') {
return (
<ul id={`${idPrefix}-newlist`}>
На клавишах
"Что если я забуду дополнительную клавишу меню?"
Реактивные ключи должны быть уникальными только в отображаемом списке . Фактически, ключи - это просто оптимизация, предотвращающая необходимость повторного рендеринга React сгенерированного списка при каждом проходе. Если вы забудете включить ключ (или ошибочно выберете ключ), React будет каждый раз пересматривать список, но это не более серьезно. В простых случаях вы не заметите падения производительности.