【问题标题】:What is the best way to change a playing video in React在 React 中更改正在播放的视频的最佳方法是什么
【发布时间】:2020-02-29 13:33:04
【问题描述】:

我正在制作一个页面,用于显示我公司的一些内部视频。有五个短视频,所以我想在左侧制作视频播放器,在右侧制作播放列表,有点像 YouTube 的做法。

但是,我希望能够单击右侧的视频,然后左侧的视频会随之发生变化,以及视频播放器下的一些元数据(标题和说明)。

我想要实现的是当单击播放列表组件项时,这应该向上传播到父组件并向下传播到视频组件。

目前我的代码如下所示:

const videos = [{
    'title' => 'Lorem ipsum',
    'short_desc' => '',
    'long_desc' => '',
    'url' => 'videofile.mp4',
    'thumbnail' => 'thumb.jpg',
    'length': 55
},{
    'title' => 'Lorem ipsum 2',
    'short_desc' => '',
    'long_desc' => '',
    'url' => 'videofile2.mp4',
    'thumbnail' => 'thumb2.jpg',
    'length': 72
}];

class App extends Component {
    constructor() {
        super();

        this.state = {
            videos: videos,
            source: videos[0]
        }
    }

    changeVideo(video) {
        // Some logig for changing video
    }

    render() {
        let playlist = this.state.videos.map((video, index) => <Playlist key={shortid.generate()} details={video} changeVideo={this.changeVideo.bind(this)} />)

        let video = <Video ref="player" source={this.state.source} />

        return(
            <div className="app">
                <section className="left">
                    {video}
                </section>
                <section className="right">
                    {playlist}
                </section>
            </div>
        )
    }
}

class Playlist extends Component {
    handleClick(e) {
        this.props.changeVideo(this);
    }

    render() {
        let {title, length, short_desc, long_desc, thumbnail} = this.props.details;
        return(
            <div className="playlistItem" onClick={this.handleClick.bind(this)}>
                <img src={thumbnail} />
                {title}
                {short_desc} ({length})
            </div>
        )
    }
}

class Video extends Component {
    changeVideo(video) {
        // change video
    }

    render() {
        return {
            <section className="playerArea">
                <Player
                    ref="player"
                    poster={this.props.source.thumbnail}
                    src={this.props.source.url}>
                    <LoadingSpinner />
                    <BigPlayButton position="center" />
                </Player>
                <h1>{this.props.source.title}</h1>
                <p>{this.props.source.long_desc}</p>
            </section>
        }
    }
}

我使用的视频播放器是video-reactjs 包。

【问题讨论】:

    标签: reactjs video.js video-reactjs


    【解决方案1】:

    应用内:

    constructor(props) {
      ...
      this.changeVideo = this.changeVideo.bind(this);
    }
    
    changeVideo(index) {
      this.setState({ source: this.state.videos[index] });
    }
    
    render() {
      let playlist = this.state.videos.map((video, index) => {
         <Playlist key={index} 
                   details={video} 
                   changeVideo={this.changeVideo.bind(null, index)} />
      })
      ...remaining code...
    

    在播放列表中:

    class Playlist extends Component {
      render() {
        let {title, length, short_desc, long_desc, thumbnail} = this.props.details;
        return(
            <div className="playlistItem" onClick={this.props.changeVideo}>
                <img src={thumbnail} />
                {title}
                {short_desc} ({length})
            </div>
        );
      }
    }
    

    编辑:替代解决方案,显式绑定changeVideo

    【讨论】:

    • 感谢您的回答!我在“const changeVideo”中收到一个意外的令牌错误,它对常量名称做出反应。我应该提到我使用 facebookincubator/create-react-app 作为样板代码,如果这可能与问题有关。
    • 将修改答案以使用替代的、更明确的方法。
    • 答案修改,注意构造函数中的附加指令,changeVideo声明方式的变化。让我知道这是如何工作的。
    • 不客气,罗尼。我也意识到我的回答没有给出太多解释。您对将索引直接绑定到作为道具传递的事件处理程序的整个概念是否满意,还是希望我详细说明这一点?
    • 如果您想给出更详尽的解释,我会很高兴!
    猜你喜欢
    • 2019-05-19
    • 1970-01-01
    • 2011-02-12
    • 1970-01-01
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多