声音云 SC.stream api 无法正常工作

sound cloud SC.stream api not working in react as wished

我们在下面有这个反应组件,我们很想在单击图像时开始从 soundcloud 流式传输歌曲。但是当列出歌曲时,所有歌曲都会同时播放..任何建议表示赞赏..

var DisplayTable = React.createClass({

    playTrack: function(track) {
        console.log('track info: >>>>>>>>>> ',track);
        SC.stream('/tracks/'+track.id, function(stream){
            stream.play();
        });
    },

    render:function(){
        //making the rows to display
        var rows=[];
        var context = this;
        this.props.data.forEach(function(track) {
            // rows.push(<tr><td>{track.title}</td><td>{track.permalink_url}</td></tr>)
            rows.push(<tr><td>{track.title}</td><td><img onClick={ context.playTrack(track) } className="images" src={track.artwork_url}/></td></tr>)

        });
        //returning the table
        return(
             <table>
                <thead>
                    <tr>
                        <th className="table-head">Title</th>
                        <th className="table-head">Album Art</th>
                    </tr>
                </thead>
                <tbody>{rows}</tbody>
            </table>
        );
    }
});

您应该为此创建一个子组件,每一行都有自己的 onClick。目前,您正在为每一行调用相同的函数,并在渲染时同时调用它们。

var TableRows = React.createClass({
    render: function(){
        var track = this.props.track;
        return (
            <tr ref="trackRow">
                <td>{track.title}</td>
                <td><img onClick={ this.playTrack } className="images" src={track.artwork_url}/></td>
            </tr>
        );
    },
    playTrack: function(){
        // use the track in your props aka... this.props.track

    }
});

然后将 foreach 更改为映射并执行此操作

this.props.data.map(function(track, i) {
    rows.push(<TableRows track={track} key={i} />);
});

注意:这是对行渲染的清理...如果您注意到在渲染它时正在调用 playTrack 函数...onClick={context.playTrack(track)}实际上是在当时和那里调用该函数...所以你不想用括号调用它,而是为每一行使用一个组件,这样你就可以访问道具中的轨道。