https://github.com/selz/plyr 미디어 플레이어를 사용하는 React 구성 요소가 있습니다. 구성 요소가 마운트 해제 될 때까지 모든 것이 올바르게 작동하므로 Vimeo API에서 오류가 발생합니다. 구체적으로는 Uncaught (in promise) TypeError: Cannot read property 'postMessage' of null
입니다.Vimeo API (ReactJS 및 Plyr 포함)
이 오류가 발생하면 this.player
이 (가) undefined
이므로 모듈을 다시로드하려고 시도하지만이를 파괴했다가 다시 시도하면로드됩니다. 아마 React Tree가 컴포넌트의 첫 번째 반복을 저장하고 있으며, 어떻게 든 그것을 완전히 파괴해야 할 필요가 있을까요?
import React, {Component, PropTypes} from 'react';
import {findDOMNode} from 'react-dom';
import plyr from 'plyr';
/**
* @desc Regex to retrieve the Vimeo video ID from the URL.
* @type {RegExp}
*/
const regex = /^.*(vimeo\.com\/)((channels\/[A-z]+\/)|(groups\/[A-z]+\/videos\/))?([0-9]+)/g;
export default class Vimeo extends Component {
static propTypes = {
url: PropTypes.string.isRequired,
};
constructor(props) {
super(props);
// Use regex to get the video id from the url
this.videoId = regex.exec(this.props.url);
}
/*
|--------------------------------------------------------------------------
| Digest Cycle
|--------------------------------------------------------------------------
*/
/**
* @desc Initiate video player.
*/
componentDidMount() {
this.player = plyr.setup(findDOMNode(this), {
controls: [],
autoplay: true,
loop: true,
mute: true,
});
this.player[0].on('ready',() => {
// Mute the video
if (!this.player[0].isMuted()) {
this.player[0].toggleMute();
}
});
}
/**
* @desc Destroy video player
*/
componentWillUnmount() {
this.player[0].destroy();
}
/*
|--------------------------------------------------------------------------
| Render
|--------------------------------------------------------------------------
*/
render() {
let player = null;
if (typeof this.videoId !== 'undefined' && this.videoId !== null) {
player = (
<div>
<div
data-type="vimeo"
data-video-id={this.videoId}
/>
</div>
);
}
return player;
}
}
@RyanPotter any updates? :) –