【发布时间】:2026-02-20 18:30:01
【问题描述】:
上下文
React 新手;我有一个父组件,它使用 react-youtube 组件从 1-6 个 youtube 视频中生成任何位置。想法是 YouTube 组件将根据数组中的 youtube 视频 ID 动态生成。目前,我正在生成像
{this.state.videoIds.map((videoId, index) =>
<YouTube
key={index}
opts={opts}
videoId={videoId}
onReady={this._onReady} />
)}
就生成组件而言,它按预期工作。但是,问题是,当this.state.videoIds 得到更新时,它会导致所有YouTube 组件都被刷新。这种行为对我来说很有意义。
问题
我遇到的问题如下:如果功能保持不变,我需要一种能够跟踪每个 YouTube 组件播放器时间的方法,以便在发生刷新时,我可以将该数据传回刷新时一直到组件,以便能够从上次中断的地方开始播放。
所以我的问题是,有没有一种方法可以动态生成这些组件而无需刷新所有现有组件?
对于它的价值,我考虑过只使用一个父组件来为每个用例静态添加组件,但这看起来非常笨拙,我真的不想走那条路。
编辑
这感觉很重要,我根据在任何给定时间加载的玩家数量平均分配屏幕空间,代码如下所示:
calculateVideoWidth = () => {
if (this.state.videoIds.length <= 3) {
return (document.body.clientWidth - 15) / this.state.videoIds.length;
} else {
return (document.body.clientWidth - 15) / this.MAX_NUMBER_OF_COLUMNS;
}
};
calculateVideoHeight = () => {
if (this.state.videoIds.length <= 3) {
return window.innerHeight - 4;
} else {
return (window.innerHeight - 4) / this.MAX_NUMBER_OF_ROWS;
}
};
在我的渲染方法中,我正在执行以下操作:
let opts = {
height: this.calculateVideoHeight(),
width: this.calculateVideoWidth()
};
查看@Tholle 的评论后,我突然想到“重新加载”来自调整大小。我想这是有道理的。必须有更好的方法来做到这一点?
编辑 1
查看此链接以了解我的体验:Video App。在输入框中,只需添加一个以','分隔的视频ID。
【问题讨论】:
-
如何将新 id 添加到
videoIds数组中? It doesn't seem to be refreshing in my simple example,但我可能误会你了。 -
只是抛出一个想法。将
<YouTube />包装在另一个扩展 PureComponent 的组件中,以便仅在更新该组件的 videoId 时发生更新? -
@Tholle,看起来我遇到的问题与布局有关。根据屏幕上的玩家数量,我将可见的屏幕空间平均分配给玩家。在我的渲染方法中,我有一个高度和宽度的函数调用。在问题中查看我的编辑。
-
我不太了解你想要实现的布局,但它不能用 CSS 来实现,例如弹性盒?
-
我认为更好的方法是删除硬编码的高度和宽度,并将 iframe 放入 div 容器中,并为它们设置适当的 n 列布局。在 google 上可以找到很多“响应式 YouTube iframe”教程,例如 google.dk/amp/s/benmarshall.me/responsive-iframes/amp
标签: javascript reactjs youtube-iframe-api