Обновление исходного URL в видео HTML5 с помощью React
Я хочу обновить тег источника в элементе видео HTML5, чтобы при нажатии кнопки все воспроизводимое содержимое переключалось на новое видео.
У меня есть компонент Clip, который возвращает элемент видео HTML5 с исходным URL-адресом, предоставленным через реквизит.
function Clip(props) {
return (
<video width="320" height="240" controls autoPlay>
<source src={props.url} />
</video>
)
}
У меня также есть компонент Movie, который содержит несколько URL-адресов, каждый из которых соответствует определенной части фильма. Он также содержит атрибут позиции, который действует как итератор, запоминая, какой раздел воспроизводится в данный момент.
class Movie extends Component {
constructor() {
super();
this.state = {
sections: [
'https://my-bucket.s3.amazonaws.com/vid1.mp4',
'https://my-bucket.s3.amazonaws.com/vid2.mp4'
],
position: 0
};
}
render() {
const sections = this.state.sections
const position = this.state.position
return (
<div>
{position}
<Clip url={sections[position]} />
<button onClick={() => this.updatePosition()}>Next</button>
</div>
)
}
updatePosition() {
const position = this.state.position + 1;
this.setState({ position: position });
}
}
Компонент Movie визуализирует компонент Clip и кнопку "Next". Когда нажимают кнопку "Далее", я хочу обновить атрибут позиции и повторно отобразить элемент видео HTML5, используя следующий URL из разделов.
На данный момент, когда я нажимаю кнопку Далее, тег источника видео HTML5 обновляется, но элемент продолжает воспроизведение видео с предыдущего URL. Может кто-нибудь помочь мне разобраться, как сбросить элемент видео?
Обновление: я создал JSFiddle, который вы можете увидеть здесь.
Обновление 2: обновление атрибута src в элементе video работает!
5 ответов
Изменение сроков <source />
похоже, по какой-то причине видео не переключается. Это не проблема реагирования, я не думаю. Наверное, просто как <source />
работает. Может быть, вам нужно позвонить .load()
на элементе снова. Но проще установить его непосредственно на самом элементе.
См. Комментарий к главному ответу: Могу ли я использовать JavaScript для динамического изменения источника видео?
Вы можете установить src
вместо этого непосредственно на элементе:
function Clip(props) {
return (
<video width="320" height="240" src={props.url} controls autoPlay>
</video>
)
}
Короткий awnser: Добавить key
опора для <Clip>
или же <video>
Например:
function Clip({ url }) {
return (
<video key={url}>
<source src={url} />
</video>
);
}
Long awnser: видео не изменится, потому что по сути вы изменяете только <source>
элемент и Реакт понимает, что <video>
должен остаться без изменений, чтобы он не обновлялся в DOM и не вызывал новый load
событие для этого источника.
Чтобы убедиться не только <source>
обновляется, но также <video>
, добавить key
поддержать его, чтобы React понимал, что это совершенно новый элемент.
Для более полного объяснения, ознакомьтесь с этой статьей о ключах в документах React:)
Вы можете использовать ключевой атрибут:
<video key={videoUrl} autoPlay width="100%">
<source src={videoUrl} type="video/mp4"></source>
</video>
Если ключевой атрибут видео изменится, компонент видео будет перемонтирован.
Добавить родительский div ко второму видео
Мой код:
{isMobile ? (
<video
autoPlay={true}
loop
className="moviles"
muted
playsInline
poster="/totto/kids.png"
>
<source src="/totto/losmoviles.webm"></source>
<source src="/totto/losmoviles.mp4"></source>
</video>
) : (
<div>
<video
autoPlay={true}
loop
className="moviles2"
muted
playsInline
poster="/totto/portada.jpg"
>
<source src="/totto/moviles.webm"></source>
<source src="/totto/moviles.mp4"></source>
</video>
</div>
)}
Свяжите URL-адрес в свойстве src тега Video, а не в теге источника.
<цикл автозапуска видео без звука playsinline = "true" webkit-playsinline = "true" [src] = "videoSrc" type = "video/mp4">