У меня есть 2 компонента -> а) VideoJSPlayer и б) VideosPage.
Как следует из названия, VideoJsPlayer имеет часть видеоплеера (с использованием videojs), а VideosPage показывает видео с использованием компонента VideoJsPlayer.
Код для каждого из компонентов:
а) ВидеоJsPlayer
import React, { useEffect } from "react";
import videojs from "video.js";
const VideoJsPlayer = props => {
let player = null;
let videoNode = null;
// Effect for first render only.
useEffect(() => {
player = videojs(videoNode, props, function onPlayerReady() {
console.log("onPlayerReady");
});
return function cleanup() {
if (player) {
player.dispose();
}
};
}, []);
return (
<div>
<div data-vjs-player>
<video ref={node => (videoNode = node)} className="video-js"></video>
</div>
</div>
);
};
export default VideoJsPlayer;
б) страница видео
import React, { useState, useEffect } from "react";
import videojs from "video.js";
import VideoJsPlayer from "../../components/VideoJsPlayer";
const VideosPage = props => {
const [videoJsOptions, setVideoJsOptions] = useState({});
// Effect for first render only.
useEffect(() => {
let videoJsOptionsTest = {
autoplay: false,
controls: true,
sources: [
{
src: "/my-video.mp4",
type: "video/mp4"
}
]
};
console.log("test");
setVideoJsOptions(videoJsOptionsTest);
// Cleanup on unmount.
return function cleanup() {};
}, []);
return (
<React.Fragment>
<VideoJsPlayer {...videoJsOptions} />
</React.Fragment>
);
};
export default VideosPage;
Когда я проверяю URL-адрес, отображающий компонент VideosPage, я не вижу никакого видео. Я предполагаю, что состояние (videoJsOptions) еще не обновлено в VideosPage, и поэтому я не вижу видео. Я вижу журнал консоли - "тест".
Когда я меняю код VideosPage на:
import React, { useState, useEffect } from "react";
import videojs from "video.js";
import VideoJsPlayer from "../../components/VideoJsPlayer";
const VideosPage = props => {
const [videoJsOptions, setVideoJsOptions] = useState({
autoplay: false,
controls: true,
sources: [
{
src: "/my-video.mp4",
type: "video/mp4"
}
]
});
// Effect for first render only.
useEffect(() => {
/*
let videoJsOptionsTest = {
autoplay: false,
controls: true,
sources: [
{
src: "/my-video.mp4",
type: "video/mp4"
}
]
};
console.log("test");
setVideoJsOptions(videoJsOptionsTest);
*/
// Cleanup on unmount.
return function cleanup() {};
}, []);
return (
<React.Fragment>
<VideoJsPlayer {...videoJsOptions} />
</React.Fragment>
);
};
export default VideosPage;
Теперь, когда я проверяю URL-адрес, отображающий компонент VideosPage, я вижу видео.
Мое предположение: в первом случае обновление состояния ставится в очередь и никогда не происходит. Потому что, если бы это произошло, он должен был бы перерендерить компонент, и я должен был бы увидеть свое видео.
Я также пытался обновить useEffect в VideoJSPlayer, чтобы он запускался каждый раз при изменении реквизита, но это не помогло.
Любые идеи по этому поводу?
Спасибо за ваше время.
Вот песочница: codesandbox