#reactjs #bootstrap-4
#reactjs #bootstrap-4
Вопрос:
Я пытаюсь создать динамическую сетку для видеокомпонентов, но не могу понять, как это сделать, потому что у меня есть элемент, который не генерируется динамически. первый видеоэлемент создается нормально, остальные элементы генерируются с помощью функции отображения.
Я хотел бы генерировать строки для каждых 3 элементов, включая первый.
Это код, который у меня есть сейчас:
renderPeers() {
return (
<div className = "participants">
<video id="myVideo" ref={video => this.video = video} controls autoPlay playsInline muted></video>
{
Object.entries(this.state.peers).map(entry => {
const [peerId, peer] = entry
console.log('render peer', peerId, peer, entry)
return (
<video key = {peerId} ref={video => peer.video = video} controls autoPlay playsInline muted></video>
);
})
}
</div>
);
}
Состояние одноранговых узлов содержит такие объекты, как:
{
peer: peerObject, // simple-peer object
peerId: peerID // peerID = socket ID of peer
}
Я мог бы генерировать строки и столбцы начальной загрузки, используя переменную counter, но у меня есть первый элемент, который не является частью массива, который я использую для генерации остальных элементов.
Как я мог бы сделать так, чтобы у меня были сгенерированные строки с 3 столбцами, включая первый элемент?
Комментарии:
1. не могли бы вы добавить пример того, как будет выглядеть состояние ваших коллег ? Это поможет выполнить console.log(this.state.peer) перед возвратом.
2. кстати, я не уверен, зачем вам нужно создавать ссылку для каждого видео
3. Добавлен пример. Часть ссылки, которую я собираюсь удалить, я просто еще не сделал.
4. Я ожидал, что этот объект состояния будет массивом, который будет повторяться (поскольку вы используете функцию map), где находятся другие одноранговые узлы? Я имею в виду, что я ожидал, что это будет похоже на: [ { peedId, peer} , { peerID, peer} ]
Ответ №1:
Я собираюсь предположить, что ваш state.peers выглядит так:
[
{
peer: {...},
peerId: 1
},
{
peer: {...},
peerId: 2
}
]
Потому что вы упомянули, что у вас есть несколько одноранговых узлов для визуализации.
Тем не менее, я уверен, что вы неправильно используете Object.entries , поскольку эта функция предоставляет итератор через ваш объект, предоставляя вам ключи и значения.
В вашем случае этот код должен решить вашу проблему:
renderPeers() {
return (
<div className = "participants">
<video id="myVideo" ref={video => this.video = video} controls autoPlay playsInline muted></video>
{
this.state.peers.map( item => {
const {peerId, peer}
return (
<video key={peerdId} ref={video => peer.video = video} controls autoPlay playsInline muted></video>
)
})
}
</div>
);
}
В основном ваша проблема была в Object.entries если вам нужно найти какие-то конкретные свойства в вашем объекте, гораздо лучше использовать оператор деструктурирования, например:
const pepe = {
id: 1,
name: 'pepe'
}
const {id,name} = pepe
console.log(id, name), //1 pepe
Вы должны использовать Object.entries, когда хотите проверить структуру объекта, обычно когда это динамический объект, структура которого вам неизвестна.
Комментарии:
1. Возможно, я ошибся, я не уверен. Приведенный выше код работает для меня просто отлично, но я хочу разместить видеоэлементы в строках и столбцах начальной загрузки (по 3 элемента в строке), чтобы они выглядели красиво. Код рендеринга не имеет проблем, но все видеоэлементы отображаются рядом друг с другом.