我正在制作一个小型音频播放器应用程序并尝试将我的反应类组件转换为功能组件。
类组件的原始代码在这里:
class Player extends React.Component {
constructor(){
super()
this.state = {
tracks: [
{title: "first track", data: track1},
{title: "second track", data: track2},
{title: "third track", data: track3},
],
currentTrack: 0,
}
}
changeData(trackIndex){
this.setState({currentTrack: trackIndex})
}
render(){
return <div style={{color: this.props.color}}>
<h1>Player</h1>
<AudioPlayer
src= {this.state.tracks[this.state.currentTrack].data}
/>
<div style={{color: "green"}}>
<ul>
{this.state.tracks.map((trackElem, index) => (
<li onClick={()=> this.changeData(index)}>{trackElem.title}</li>
))}
</ul>
</div>
</div>
}
}
我尝试了以下转换:
const Player2 = () => {
const Items = [
{title: "first track", data: track1},
{title: "second track", data: track2},
{title: "third track", data: track3},
];
const [activeTrack, setActiveTrack] = useState(0);
function ChangeData(trackIndex) {
setActiveTrack({activeTrack : trackIndex});
}
return (
<div >
<h1>Player</h1>
<AudioPlayer
src= {activeTrack.data}
/>
<div >
<ul>
{Items.map((trackElem, index) => (
<li onClick={()=> ChangeData(index)}>{trackElem.title}</li>
))}
</ul>
</div>
</div>
)
}
除了删除一些与样式相关的道具之外,逻辑基本相同。唯一的区别是当前轨道的处理,我试图通过使用状态来表示这一点。
当将对象渲染到不同的页面时,它在屏幕上看起来完全正常,唯一的问题是轨道本身不再触发音频播放器中的响应。
如果有人能找出我在转换过程中遗漏的任何东西,真的会很感激吗?