У меня есть 2 компонента -> a) VideoJSPlayer и b) VideosPage.
Как следует из названия, VideoJsPlayer имеет часть проигрывателя видео (с использованием видео js), а VideosPage показывает видео с использованием компонента VideoJsPlayer.
Код для каждого из компонентов:
a) VideoJsPlayer
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;
b) VideosPage
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 и, следовательно, я не вижу видео. Я вижу консольный журнал - "test", хотя.
Когда я изменяю код 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