javascript - 将 React 类组件转换为功能组件,完美渲染但功能丢失?
问题描述
我正在制作一个小型音频播放器应用程序并尝试将我的反应类组件转换为功能组件。
类组件的原始代码在这里:
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>
)
}
除了删除一些与样式相关的道具之外,逻辑基本相同。唯一的区别是当前轨道的处理,我试图通过使用状态来表示这一点。
当将对象渲染到不同的页面时,它在屏幕上看起来完全正常,唯一的问题是轨道本身不再触发音频播放器中的响应。
如果有人能找出我在转换过程中遗漏的任何东西,真的会很感激吗?
解决方案
这里:
const [activeTrack, setActiveTrack] = useState(0);
最初状态activeTrack
中的数字也是如此。但是你这样做了
src= {activeTrack.data}
这是没有意义的——这个数字没有data
属性。另一个问题是
setActiveTrack({activeTrack : trackIndex});
现在您将活动轨道设置为具有activeTrack
属性的对象,这也与上述两种格式不同。
选择一种方式来表示、设置和检索整个组件的状态,例如索引:
function ChangeData(trackIndex) {
setActiveTrack(trackIndex);
}
<AudioPlayer
src={Items[activeTrack].data}
推荐阅读
- php - 网站不显示使用 PHP 存储在数据库中的图像
- c# - Xamarin iOS 高存储使用和奇怪的文件
- typescript - 问题将 ResizeSensor 导入打字稿
- python - !!ValueError:检查输入时出错:预期 lstm_2_input 具有 3 个维度,但得到的数组具有形状 (4982, 12)
- spring - 返回插入记录的处理程序
- angular - 有没有办法通过 @angular/animations 通过 Ionic 特定的 css 属性进行动画处理?
- c# - Html 未显示在控制器中创建的视图中
- java - 我们可以将 Spring Cloud 合约请求/响应属性设为可选吗?
- javascript - 如何:从控制器返回文件后重置引导按钮状态
- python-3.x - 将多个数据框及其各自的日期组合在一个数据框中?