我有一个使用https://github.com/selz/plyr媒体播放器的 React 组件。在组件卸载之前一切正常,这会导致 Vimeo API 出错。具体来说:Uncaught (in promise) TypeError: Cannot read property 'postMessage' of null
。
发生此错误后,我尝试再次加载该模块,它会因为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;
}
}