Не уверен, почему вам нужно сделать это таким образом - я уверен, что есть и другие способы рендеринга Link
s на основе массива в вашу DOM.
Однако, если вы настаиваете, вы должны использовать ReactDOM
В вашем цикле:
// create an empty div to hold our links:
const tempDiv = document.createElement('div');
// render links into the empty div
ReactDOM.render(eventLinks, tempDiv);
// append the link, since you don't want the div in cell
cell.appendChild(tempDiv.firstChild); // there is only 1 child
Это очень "хаки" - я очень рекомендую поискатьнастоящий "Реактивный" способ сделать это.
РЕДАКТИРОВАТЬ:
ваш обновленный код не будет работать.react-router
полагается на внутренний контекст для навигации, и компоненты *Router
предоставляют этот контекст - ваш код отображает BrowserRouter
для каждой ссылки, означая, что каждая ссылка будет иметь свой собственный контекст.Несколько маршрутизаторов, вероятно, не будут хорошо работать на одной странице, поскольку они будут бороться с контролем над браузером.
Прежде всего вам, вероятно, не следует вызывать ReactDOM.render
в каждой итерации цикла.ReactDOM.render
получает контроль над всем содержимым вашего cell
- рендеринг его снова и снова означает, что работает только последний вызов.
Во-вторых, ваш BrowserRouter
должен быть размещен на верхнем уровне вашего приложения (например, в вашем корневом компоненте).
Опять же, манипулирование dom таким способом не является тем, как вы должны использовать React.Мне интересно, какое приложение вы создаете и как оно структурировано?
Итак, вот что, я думаю, вам следует сделать - поскольку вы уже используете реагирование, я думаю, что существует дерево компонентов (например, у вас есть компонент верхнего уровня, который отображает другие компоненты и т. Д.)
Итак, в самом верху вашего приложения вы должны обернуть все в BrowserRouter.
// index.js, maybe.
// assuming App is your "top level component"
import App from './App.jsx';
ReactDOM.render(
<BrowserRouter>
<App />
</BrowserRouter>
, document.getElementById('root'))
И теперь создайте EventLinks
компонент, который отображает все ссылки:
// EventLinks.jsx
const EventLinks = ({ events }) => (
events.map((event) => (
<li key={event.eventId}>
<Link to={`/events/${event.eventId}`}>
{event.title}
</Link>
</li>
))
);
В вашем компоненте, где живет cell
, визуализируйте ссылки напрямую.
// Cell component
const Cell = ({ events }) => {
// filter events if you need to here, since you have that `if` logic originally
const visibleEvents = events.filter(filterFunction);
return (
<ul>
<EventLinks events={visibleEvents} />
</ul>
);
}
Возможно, это не совсем соответствует структуре вашего приложения, но я надеюсь, что вы поняли.
, поэтому ваш App
отображает макет и Cell
компонент, а затем ваш Cell
рендеринг EventLinks
.
Честно говоря, вы вообще не должны использовать ReactDOM, за исключением единственной точки входа в ваше приложение.