【发布时间】:2018-12-03 16:39:56
【问题描述】:
我正面临需要从 DOM 中完全删除一个元素并重新附加它的情况。更具体地说,Airplay 功能中的一个错误会导致在更改视频元素的 src 时丢失曲目信息:
- 更改 videoelement 的 src 属性并开始在 Apple TV 上播放
- 现在将源切换到其他视频
- 曲目信息(音频、文本)丢失
我找到了一种解决方法,需要我从 DOM 中删除视频元素,创建一个新元素并将其重新添加到 DOM。用反应来做到这一点的最好方法是什么?我尝试设置我的子组件的 key 属性,但这似乎没有这样做。以下是代码的摘录:
class Container extends Component {
render() {
<Video key={this.videoElementKey} />
}
}
class Video extends Component {
render() {
return (
<video id="vid" className="video-elem" playsInline />
);
componentDidMount() {
console.log("componentDidMount");
}
}
组件按照我的预期重新安装。这是否意味着视频元素被删除并再次读取?另外,组件的ref属性是否刷新了?
【问题讨论】:
-
是的,
key应该会有所帮助。通过您的示例,很难意识到有什么问题,因为<Container>与<Child>没有任何共同之处。在您的情况下,由于您需要在更改src后重新安装<video>我相信您可以使用key={this.props.urlToVideo} src={this.props.urlToVideo} -
只需将
<video>用作组件并通过更改道具来呈现它。进行跟踪会更容易。 -
对不起Child的错误命名。我修复了这个问题,Video 组件现在在 Container 组件中被引用。但是,重新安装 Video 组件似乎不会从 DOM 中删除 HTML5 视频元素。由于上述 Airplay 实现中的错误,这就是我所需要的。在纯 JavaScript
document.body.removeChild(document.getElementById('vid')); -
嘿@DanielSilhavy 在下面查看我的答案,它通过反应stackoverflow.com/questions/53598070/…从DOM 中删除组件
标签: javascript reactjs