REACT:LOAD页面状态为真后,尽管Usestate为false
在应用程序中,通过单击按钮,我想做2件事:播放音频文件,显示2张图片。再次单击按钮后,我想关闭音频并隐藏2张图片。音频有效,但图片发疯了。为什么?我将USESTATE设置为默认情况下的“ false”,但是在加载页面后,它们是“ true”。我不明白为什么?
import {useEffect, useRef, useState} from "react";
import styled from "./Cat.module.scss";
import Swing from "../../assets/audio/GirlsLikeToSwing.mp3";
let dancingImg = ['https://i.gifer.com/P6XV.gif', 'https://i.gifer.com/DCy.gif']
const Cat = () => {
const [isPlaying, setIsPlaying] = useState(false);
const audioElement = useRef();
const [ladyDancing, setLadyDancing] = useState(false);
const [catDancing, setCatDancing] = useState(false);
const playPause = () => {
setIsPlaying(!isPlaying);
}
useEffect(() => {
if (isPlaying) {
audioElement.current.play();
setLadyDancing(ladyDancing);
setCatDancing(catDancing);
} else {
audioElement.current.pause();
setLadyDancing(!ladyDancing);
setCatDancing(!catDancing);
}
}, [isPlaying]);
return (<div className={styled.headerContainer}>
<div className={styled.lady}>
{ladyDancing ? <img src={dancingImg[0]} alt="" className={styled.ladyDancing}/> : null}
{catDancing ? <img src={dancingImg[1]} alt="" className={styled.catDancing}/> : null}
</div>
<button onClick={playPause}>Play</button>
<audio src={Swing} ref={audioElement}></audio>
</div>
)
};
export default Cat;
In the application, by clicking on the button, I want to do 2 things: play an audio file, show 2 pictures. After clicking the button again, I want to turn off the audio and hide 2 pictures. The audio works, but the pictures go crazy. Why? I set useState as "false" in default, but after loading pages they are "true". I do not understand why?
import {useEffect, useRef, useState} from "react";
import styled from "./Cat.module.scss";
import Swing from "../../assets/audio/GirlsLikeToSwing.mp3";
let dancingImg = ['https://i.gifer.com/P6XV.gif', 'https://i.gifer.com/DCy.gif']
const Cat = () => {
const [isPlaying, setIsPlaying] = useState(false);
const audioElement = useRef();
const [ladyDancing, setLadyDancing] = useState(false);
const [catDancing, setCatDancing] = useState(false);
const playPause = () => {
setIsPlaying(!isPlaying);
}
useEffect(() => {
if (isPlaying) {
audioElement.current.play();
setLadyDancing(ladyDancing);
setCatDancing(catDancing);
} else {
audioElement.current.pause();
setLadyDancing(!ladyDancing);
setCatDancing(!catDancing);
}
}, [isPlaying]);
return (<div className={styled.headerContainer}>
<div className={styled.lady}>
{ladyDancing ? <img src={dancingImg[0]} alt="" className={styled.ladyDancing}/> : null}
{catDancing ? <img src={dancingImg[1]} alt="" className={styled.catDancing}/> : null}
</div>
<button onClick={playPause}>Play</button>
<audio src={Swing} ref={audioElement}></audio>
</div>
)
};
export default Cat;
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
使用效果
在第一个渲染和所有后续更新期间运行。我相信您可能需要根据您想要的状态明确地执行setladydancing对True或false,否则它将继续根据其先前状态进行切换。
也许这可能有效:
useEffect
runs during the first render and all subsequent updates.I believe you might need to explicitly perform setLadyDancing to true or false depending on the state that you want them to be, otherwise it will keep getting toggled based on its previous state.
Maybe this might work:
只需使用
iSplaying
图像状态即可。Just use
isPlaying
state for images.该页面加载时状态是正确的,因为在初始渲染上
useeffect
block被调用,然后将它们设置为!ladyDancing
和!catDancing
使它成为现实。我建议对其使用单独的功能(并删除
useffect
)。以及关于图片的内容:当
Isplaying
是正确时,您将它们设置为它们的值。为了解决这个问题,您需要将它们设置为true
(播放时)或false
(不播放时)。代码:
The state is true when the page loads because on the initial render the
useEffect
block gets called and it's setting them to!ladyDancing
and!catDancing
which makes it true.I recommend using a separate function for it (and remove
useEffect
).And also about the pictures: you are setting them to their values when
isPlaying
is true. To fix that, you would need to set them totrue
(when playing) orfalse
(when not playing).The code: