将 React class 组件转换为功能组件,渲染完美但功能丢失?
Converting react class component to functional component, rendering perfectly but functionality lost?
我正在制作一个小型音频播放器应用程序并尝试将我的 React class 组件转换为功能组件。
class 组件的原始代码在这里:
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
最初是一个 number 状态。但后来你做了
src= {activeTrack.data}
这没有意义 - 该数字没有 data
属性。另一个问题是
setActiveTrack({activeTrack : trackIndex});
现在您将活动轨道设置为具有 activeTrack
属性 的对象,这也与上述两种格式不同。
选择一种方式来表示、设置和检索整个组件的状态,例如索引:
function ChangeData(trackIndex) {
setActiveTrack(trackIndex);
}
<AudioPlayer
src={Items[activeTrack].data}
我正在制作一个小型音频播放器应用程序并尝试将我的 React class 组件转换为功能组件。
class 组件的原始代码在这里:
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
最初是一个 number 状态。但后来你做了
src= {activeTrack.data}
这没有意义 - 该数字没有 data
属性。另一个问题是
setActiveTrack({activeTrack : trackIndex});
现在您将活动轨道设置为具有 activeTrack
属性 的对象,这也与上述两种格式不同。
选择一种方式来表示、设置和检索整个组件的状态,例如索引:
function ChangeData(trackIndex) {
setActiveTrack(trackIndex);
}
<AudioPlayer
src={Items[activeTrack].data}