提取处于状态的 react-youtube 的播放功能以在按钮 oncluck 中使用导致 CORS
Extracting play function of react-youtube in state to use in button oncluck results in CORS
我在我的 React 项目中使用来自 npm 的 react-youtube 库。我想在按钮 onClick 事件上播放和暂停 YouTube 视频。
我尝试从 YouTube 组件中提取事件和函数到状态,然后通过按钮 onClick 调用该函数,但它会导致跨源错误“未捕获错误:抛出跨源错误。React 没有访问权限到开发中的实际错误对象。有关更多信息,请参阅 https://reactjs.org/link/crossorigin-error。“
我究竟做错了什么?
以及如何从另一个组件(如按钮)触发 YouTube 组件事件?
import './App.css';
import YouTube from 'react-youtube';
import React, { Component } from 'react';
class App extends Component {
constructor(props){
super(props);
this.state = {
playerPlayVideo: () => {}
}
this.videoOnReady = this.videoOnReady.bind(this);
}
videoOnReady(event) {
// access to player in all event handlers via event.target
this.setState({
playerPlayVideo: event.target.playVideo
});
}
render() {
const opts = {
height: '390',
width: '640',
};
return (
<div>
<YouTube videoId="2g811Eo7K8U" opts={opts} onReady={this.videoOnReady} />
<button onClick={this.state.playerPlayVideo}>play</button>
</div>
);
}
}
export default App;
'react-youtube' 在内部使用 YouTube Api。玩家执行的动作基于 event.target
。您正在将回调函数 playVideo 保存在一个状态中,这可能会导致范围问题。
在这种情况下,您可以简单地将 event.target 对象存储在状态中,而不是将 'playVideo' 函数存储在状态中。
this.state = {
playerPlayVideo: {},
};
然后在点击按钮时,您可以像这样简单地调用 playVideo,
<button onClick={() => this.state.playerPlayVideo.playVideo()}>
play
</button>
这行得通!!我已经测试过了。
您还可以通过切换状态逻辑来改善这一点,因为您现在直接将 event.target
存储在状态中。
因此,您现在可以同时调用 'playVideo' 和 'pauseVideo'
我在我的 React 项目中使用来自 npm 的 react-youtube 库。我想在按钮 onClick 事件上播放和暂停 YouTube 视频。
我尝试从 YouTube 组件中提取事件和函数到状态,然后通过按钮 onClick 调用该函数,但它会导致跨源错误“未捕获错误:抛出跨源错误。React 没有访问权限到开发中的实际错误对象。有关更多信息,请参阅 https://reactjs.org/link/crossorigin-error。“
我究竟做错了什么?
以及如何从另一个组件(如按钮)触发 YouTube 组件事件?
import './App.css';
import YouTube from 'react-youtube';
import React, { Component } from 'react';
class App extends Component {
constructor(props){
super(props);
this.state = {
playerPlayVideo: () => {}
}
this.videoOnReady = this.videoOnReady.bind(this);
}
videoOnReady(event) {
// access to player in all event handlers via event.target
this.setState({
playerPlayVideo: event.target.playVideo
});
}
render() {
const opts = {
height: '390',
width: '640',
};
return (
<div>
<YouTube videoId="2g811Eo7K8U" opts={opts} onReady={this.videoOnReady} />
<button onClick={this.state.playerPlayVideo}>play</button>
</div>
);
}
}
export default App;
'react-youtube' 在内部使用 YouTube Api。玩家执行的动作基于 event.target
。您正在将回调函数 playVideo 保存在一个状态中,这可能会导致范围问题。
在这种情况下,您可以简单地将 event.target 对象存储在状态中,而不是将 'playVideo' 函数存储在状态中。
this.state = {
playerPlayVideo: {},
};
然后在点击按钮时,您可以像这样简单地调用 playVideo,
<button onClick={() => this.state.playerPlayVideo.playVideo()}>
play
</button>
这行得通!!我已经测试过了。
您还可以通过切换状态逻辑来改善这一点,因为您现在直接将 event.target
存储在状态中。
因此,您现在可以同时调用 'playVideo' 和 'pauseVideo'