Video angezeigt ReactJS Komponente nicht aktualisiert
Ich bin neu ReactJS (0.13.1), und ich habe eine Komponente in meinem app zur Anzeige von HTML5-video.
Es scheint zu funktionieren perfekt, aber nur für die erste Auswahl. Das video, das aktuell angezeigt wird und das spielen in der Seite ändert sich nicht, wenn Sie wechseln von einem video zum anderen (wenn this.props.video
änderungen).
Sehe ich die <source src='blah.mp4' />
elements update in den Chrome-inspector, sondern die tatsächlich erbrachte video in die Seite ändert sich nicht und hält zu spielen, wenn es das schon war. Dasselbe passiert in Safari & Firefox. Alle anderen Elemente aktualisieren entsprechend gut.
Irgendwelche Ideen?
Sowieso meine Komponente unter:
(function(){
var React = require('react');
var VideoView = React.createClass({
render: function(){
var video = this.props.video;
var title = video.title === ''? video.id : video.title;
var sourceNodes = video.media.map(function(media){
media = 'content/'+media;
return ( <source src={media} /> )
});
var downloadNodes = video.media.map(function(media){
var ext = media.split('.').slice(-1)[0].toUpperCase();
media = 'content/'+media;
return (<li><a className="greybutton" href={media}>{ext}</a></li>)
});
return (
<div className="video-container">
<video title={title} controls width="100%">
{sourceNodes}
</video>
<h3 className="video-title">{title}</h3>
<p>{video.description}</p>
<div className="linkbox">
<span>Downloads:</span>
<ul className="downloadlinks">
{downloadNodes}
</ul>
</div>
</div>
)
}
});
module.exports = VideoView;
})();
UPDATE:
Beschreiben es anders:
Habe ich eine Liste von links mit onClick-Handler, legen Sie die Schrauben der Komponente.
Wenn ich auf ein video-link ("Video " Foo") für die erste Zeit bekomme ich
<video title="Video Foo" controls>
<source src="video-foo.mp4"/>
<source src="video-foo.ogv"/>
</video>
und "Video " Foo" angezeigt und abgespielt werden können.
Dann, wenn ich auf den nächsten ("Video Bar") die DOM-updates und ich bekomme
<video title="Video Bar" controls>
<source src="video-bar.mp4"/>
<source src="video-bar.ogv"/>
</video>
Jedoch ist es immer noch "Video " Foo", die ist sichtbar und kann gespielt werden.
Es ist wie einst der browser geladen hat, die Medien für eine <video>
es ignoriert alle änderungen an der <source>
Elemente.
- geben Sie optional ist, ist der browser fragt den server die Bereitstellung der Datei für ein Typ ist, wenn es nicht zur Verfügung gestellt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den ich beschrieben habe, einige Ansätze für plain JavaScript hier. Auf dieser Basis habe ich Lösungen gefunden, die für Reagieren, die für mich arbeiten:
mit
src
Attribut auf video selbst:Dana ' s Antwort ist eine gute option, die Ausweitung dieser Lösung.
mit
.load()
call-auf-video-element:UPD:
natürlich ist es möglich, fügen Sie einzigartige
key
Attribut für<video>
- tag (zum Beispiel basierend auf Ihren Quellen), so wenn in den Quellen wird sich ändern, es wird geändert. Aber es wird dazu führen<video>
neu gerendert, völlig, und es kann dazu führen, dass einige UI blinkt.Fand die Antwort
https://html.spec.whatwg.org/multipage/embedded-content.html#the-source-element
Es ist eine ziemlich hacky und zerbrechlich, aber es bekam den job zu erledigen für meinen Fällen.
Ich Stand vor dem gleichen Problem, und ich hatte keinen Zugriff auf die
<video>
HTML-tag, wie ich war, mit einer Bibliothek zum Rendern der Videos (nicht die native<video>
HTML-tag), die ist intern verantwortlich für die Erbringung der<video>
tag.In diesem Fall habe ich eine andere Lösung gefunden, die ich denke, ist besser zu lösen, das gleiche Problem.
Bevor:
Nach:
Oder diese, wenn Sie sind unter Verwendung der nativen
<video>
HTML-tag:Diese Weise Reagieren wird Darstellung unterschiedlicher video-tags, weil die
src
prop wird unterschiedlich sein, daher rendering ein anderes HTML-tag jedes mal, um dieses Problem zu vermeiden.Ich finde diese Art sauberer und einfacher und funktioniert in beiden Fällen, wenn Sie haben oder nicht haben Zugang zu den
<video>
HTML-tag.Ich hatte das gleiche problem mit einer playlist mit videos.
Also trennte ich den video-player auf einen anderen reagieren Komponente
und diese Komponente erhielt zwei Requisiten: contentId (video identifizieren) & videoUrl (video-URL).
Auch ich habe ein ref auf das video-tag, damit ich es Schaffe den tag.
dies ist viel mehr sauber: