【发布时间】:2021-07-06 23:10:43
【问题描述】:
基本上,我试图在每次单击按钮时在按钮内的暂停/播放图标之间更改图像源。我的问题不在于将状态传递给源,而是在更新状态时更改源。
const playButton = "/images/play-button.svg";
const pauseButton = "/images/pause-button.svg";
我有一个数据源,我们将调用data,它是一个包含音频文件的数组,我将它映射到一个包含音频对象、播放状态和按钮 URL 的并行数组,类似于:
const [audioArray, setAudioArray] = useState([]);
useEffect( () => {
var audioArrayHolder = [];
data.map( item => {
var audioItem = new Audio(item.audioURL);
audioArrayHolder.push({
audio: audioItem,
playState: false,
button: playButton
})
});
setAudioArray(audioArrayHolder);
}, [data]);
现在可以将其加载到一组组件中,每个组件都有一个处理其音频播放的按钮:
function handlePausePlay(someIndex) {
var audioArrayCopy = audioArray;
var audioArrayObj = audioArray(someIndex);
if (audioArrayObj.playState) {
audioArrayObj.audio.pause();
audioArrayObj.playState = false;
audioArrayObj.button = playButton;
} else {
audioArrayObj.audio.play();
audioArrayObj.playState = true;
audioArrayObj.button = pauseButton;
}
audioArrayCopy[someIndex] = audioArrayObj;
setAudioArray(audioArrayCopy);
}
data.map( (item, index) => {
<div>
<ExampleComponent songName={data.name} songArtists={data.artists}/>
<button onClick={handlePausePlay(index)}>
<img src={audioArray[index].button} alt="Pause/Play Button"/>
</button>
</div>
});
这会通过一个功能性暂停/播放按钮很好地加载所有组件,该按钮根本不会改变图像。每次按下按钮时,handlePausePlay 会在该索引处更新audioArray 的状态,并成功更改audioArray[index].button 属性,但src 已经渲染,因此图像卡在playButton,默认。
我尝试将图像作为一个单独的组件并将src 作为道具传递,并通过按下按钮将索引保存到名为currentIndex 的状态常量中,并将其传递到源中(即<img src={audioArray[currentIndex].button} ... /> ) 以及介于两者之间的许多愚蠢的想法。
这应该是一个微不足道的问题,但老实说,我作为一个新手在 2 天的大部分时间里都感到困惑。任何帮助表示赞赏。
【问题讨论】:
-
audioArray[index].button 的内容是什么? “播放按钮”?
-
是的,在问题的顶部,它被定义为图像的 url。它的功能还在于图像成功显示 url,只是在 .button 属性设置为 pauseButton 时不会重新渲染
-
可以把handlePausePlay的代码加到帖子里吗?
-
当然,我认为这不是最干净的方法,但哈哈。它确实有效,因为音频开始/停止,这意味着 .playState 属性正在更新(并且 .button 也是如此)
标签: javascript reactjs state