2016-07-05 18 views
0

我正在开发我的第一个reactjs项目。这是一个视频播放列表,所以这是我如何组织我的项目的一个组成部分现在反应 - 更改项目或父项的状态?

- Component Playlist Box (just a wrapper for the playlist 
-- Component Playlist (the list of video) 
--- Component Video (single video) 

,我每次点击一个视频组件上的时候,它必须改变其“打”的状态为true,并且一个是在那一刻玩耍(如果有的话)必须将其“玩”状态改变为假。

这里是我的疑问: 最好是改变点击的视频组件的状态,以便它再次呈现,并且还改变播放视频状态,或者最好改变播放列表组件的状态,所以它根据我传递给列表组件的某些参数渲染每个视频项目?管理这个最好的方法是什么?

+4

保持您的状态尽可能高。如果您发现将深度状态向下传递很麻烦,请使用redux。 – azium

回答

0

当决定存储特定状态的位置时,只需从层次结构中的最内层组件(在本例中为Component Video)开始,并询问“该组件是否需要了解此状态?”

那么Component Video需要知道它自己的播放状态吗?绝对。 ;)上一级的组件播放列表呢?如果Component Playlist没有渲染任何关心Component Video是否播放的内容,那么只需将Component的播放状态放在Component Video上即可。

就像一个例子:比方说,只有在播放单个视频组件时,您才会呈现闪烁的灯光。但播放列表唯一的工作是列出单个视频,而不关心视频是否正在播放。在这种情况下,将状态置于视频组件上是有意义的。

另一方面,让我们说,播放列表呈现了一些文本,指示当前正在播放的视频的名称。然后,将状态存储在播放列表中将是有意义的。例如:

class PlayList extends React.Component { 
    constructor(props) { 
    super(props); 

    this.videoPlay = this.videoPlay.bind(this); 
    this.videoStop = this.videoStop.bind(this); 

    this.state = { 
     playingVideoName: '', 
    }; 
    } 

    videoPlay(name) { 
    this.setState({ playingVideoName: name }); 
    } 

    videoStop() { 
    this.setState({ playingVideoName: '' }); 
    } 

    renderVideoList() { 
    // begin loop 
     <Video id={someId} onPlay={this.videoPlay} onStop={this.videoStop} 
    // end loop 
    } 

    render() { 
    return <div> 
     {this.renderVideoList()} 

     <div> 
     Currently playing: {this.state.playingVideoName} 
     </div> 
    </div> 
    } 
} 
+0

感谢@ffxsam你的回答很明确。我仍然困惑的是如何应对旧的播放视频的状态变化。举个例子:播放的视频组件闪烁,但是当一个新的视频组件播放时,这个新的应该开始闪烁,旧的应该停止闪烁。那么新的闪烁视频是否必须改变旧的视频状态,或者它是应该管理其子组件的“闪烁”状态的播放列表组件? –

+0

对,如果视频1正在播放,并且突然在视频2上播放,则需要停止视频1。我正在构建一个具有非常类似功能但具有音轨的应用程序。我使用Redux结束了,所有音轨都使用它与中央Web Audio API组件通信,该组件可从Amazon S3加载音频文件并播放它们。 – ffxsam

+1

另一种方法是建立一个“”组件,该组件有几个子组件。在PlayList的代码中,它可以编程方式为每个孩子添加道具,以便它可以维护他们的集体状态并发出命令。 – ffxsam

相关问题