React useState() 布尔切换组件添加而不是替换值
React useState() boolean toggle component adding instead of replacing values
我创建了一个模拟社交媒体网站,用户可以在其中评论和“喜欢”帖子,因此我想要一个竖起大拇指的按钮,可以在“喜欢”和“不喜欢”之间切换。问题是,当我单击时,状态值(不喜欢)被替换的 setState 值(喜欢)加入。我哪里错了?
import React, { useState } from 'react';
import ThumbUpIcon from '@material-ui/icons/ThumbUp';
const ThumbUpButton = {
backgroundColor: 'rgb(115, 250, 179)',
border: 'none',
borderRadius: '5px',
}
const ThumbStyle = {
backgroundColor: 'red',
border: 'none',
padding: '5px',
borderRadius: '5px',
margin: '1rem'
}
const Liker = () => {
const [thumb, setThumbUp] = useState(false);
return (
<>
<button style={{border: 'none', backgroundColor: 'transparent'}} onClick={() => setThumbUp(!thumb)}>
<ThumbUpIcon style={ThumbStyle} />
{thumb && <ThumbUpIcon style={ThumbUpButton} />}
</button>
</>
);
}
export default Liker;
首先你应该通过 callbacksetThumbUp ((thumb) => !thumb)
更新你的状态,其次你在这一行 <ThumbUpIcon style={ThumbStyle} />
中遇到了问题,这个 JSX 渲染了按钮是否被点击,所以你必须把条件:
import React, { useState } from 'react';
import ThumbUpIcon from '@material-ui/icons/ThumbUp';
const ThumbUpButton = {
backgroundColor: 'rgb(115, 250, 179)',
border: 'none',
borderRadius: '5px',
};
const ThumbStyle = {
backgroundColor: 'red',
border: 'none',
padding: '5px',
borderRadius: '5px',
margin: '1rem',
};
const Liker = () => {
const [thumb, setThumbUp] = useState(false);
const style = thumb ? ThumbUpButton : ThumbStyle;
return (
<>
<button
style={{ border: 'none', backgroundColor: 'transparent' }}
onClick={() => setThumbUp((thumb) => !thumb)}
>
<ThumbUpIcon style={style} />
</button>
</>
);
};
export default Liker;
改变这可能有效
使用功能设置状态
onClick={() => 设置大拇指(s=>!s)}
如果我理解你的问题,你是在问为什么有时会同时呈现赞同和不赞同。这是因为你无条件地表示赞成,有条件地表示不喜欢。
您应该渲染其中之一。由于它是相同的组件,而您只是交换样式,因此有条件地应用一种或另一种样式。
此外,在切换布尔状态值时通常使用功能状态更新,因为下一个状态必然取决于前一个状态,即 thumb => !thumb
。这避免了回调中的陈旧状态封闭。
<button
style={{
border: 'none',
backgroundColor: 'transparent'
}}
onClick={() => setThumbUp(thumb => !thumb)}
>
<ThumbUpIcon style={thumb ? ThumbStyle : ThumbUpButton} />
</button>
请直接设置值
onClick={() => setThumbUp(!thumb)}
我创建了一个模拟社交媒体网站,用户可以在其中评论和“喜欢”帖子,因此我想要一个竖起大拇指的按钮,可以在“喜欢”和“不喜欢”之间切换。问题是,当我单击时,状态值(不喜欢)被替换的 setState 值(喜欢)加入。我哪里错了?
import React, { useState } from 'react';
import ThumbUpIcon from '@material-ui/icons/ThumbUp';
const ThumbUpButton = {
backgroundColor: 'rgb(115, 250, 179)',
border: 'none',
borderRadius: '5px',
}
const ThumbStyle = {
backgroundColor: 'red',
border: 'none',
padding: '5px',
borderRadius: '5px',
margin: '1rem'
}
const Liker = () => {
const [thumb, setThumbUp] = useState(false);
return (
<>
<button style={{border: 'none', backgroundColor: 'transparent'}} onClick={() => setThumbUp(!thumb)}>
<ThumbUpIcon style={ThumbStyle} />
{thumb && <ThumbUpIcon style={ThumbUpButton} />}
</button>
</>
);
}
export default Liker;
首先你应该通过 callbacksetThumbUp ((thumb) => !thumb)
更新你的状态,其次你在这一行 <ThumbUpIcon style={ThumbStyle} />
中遇到了问题,这个 JSX 渲染了按钮是否被点击,所以你必须把条件:
import React, { useState } from 'react';
import ThumbUpIcon from '@material-ui/icons/ThumbUp';
const ThumbUpButton = {
backgroundColor: 'rgb(115, 250, 179)',
border: 'none',
borderRadius: '5px',
};
const ThumbStyle = {
backgroundColor: 'red',
border: 'none',
padding: '5px',
borderRadius: '5px',
margin: '1rem',
};
const Liker = () => {
const [thumb, setThumbUp] = useState(false);
const style = thumb ? ThumbUpButton : ThumbStyle;
return (
<>
<button
style={{ border: 'none', backgroundColor: 'transparent' }}
onClick={() => setThumbUp((thumb) => !thumb)}
>
<ThumbUpIcon style={style} />
</button>
</>
);
};
export default Liker;
改变这可能有效 使用功能设置状态
onClick={() => 设置大拇指(s=>!s)}
如果我理解你的问题,你是在问为什么有时会同时呈现赞同和不赞同。这是因为你无条件地表示赞成,有条件地表示不喜欢。
您应该渲染其中之一。由于它是相同的组件,而您只是交换样式,因此有条件地应用一种或另一种样式。
此外,在切换布尔状态值时通常使用功能状态更新,因为下一个状态必然取决于前一个状态,即 thumb => !thumb
。这避免了回调中的陈旧状态封闭。
<button
style={{
border: 'none',
backgroundColor: 'transparent'
}}
onClick={() => setThumbUp(thumb => !thumb)}
>
<ThumbUpIcon style={thumb ? ThumbStyle : ThumbUpButton} />
</button>
请直接设置值
onClick={() => setThumbUp(!thumb)}