【发布时间】:2020-06-07 08:50:43
【问题描述】:
我正在尝试使用 Open trivia Api 开发一个带有 React 的应用程序。我已经映射了一个按钮组件(使用材料 ui)来显示每个问题的不同答案。我现在正在努力仅针对单击的对象来应用 css 属性:如果答案正确,则应变为绿色,否则为红色。问题是一旦我点击,所有按钮都会变成红色或绿色。我试图将索引存储在一个状态并比较真实的索引,但它不起作用。这是我的代码: 在主APP.js中
const [clickedOne, setClickedOne] = useState({
clickedIndex: null,
});
useEffect(() => {
grabData();
}, []);
const handleClick = (choice, ke) => {
setChoice(choice);
if (choice === data.correct_answer) {
setIsCorrect(true);
} else {
setIsCorrect(false);
}
setClickedOne({ clickedIndex: ke });
grabData();
};
渲染内的映射按钮:
{answers.map((answer, index) => {
return (
<ContainedButtons
choice={handleClick}
answer={answer}
correct={data.correct_answer}
isCorrect={isCorrect}
key={index}
id={index}
clicked={clickedOne}
/>
);
})}
Button 组件内部:
const backStyle = () => {
if (clicked === id) {
if (isCorrect) {
return "green";
} else if (isCorrect === false) {
return "red";
} else {
return null;
}
}
};
return (
<div className={classes.root}>
<Button
style={{ backgroundColor: backStyle() }}
value={answer}
onClick={() => choice(answer, id)}
variant="contained"
>
{decodeURIComponent(answer)}
</Button>
当我现在在 backstyle 函数中检查 clicked===id 时,现在什么也没有发生。如果没有检查,我会将所有按钮都设置为红色或绿色。 谢谢大家的帮助!
【问题讨论】:
-
React 在您执行任何操作(例如单击/检查等)时为您提供 SyntheticEvent 对象。在这种情况下,您将获得 currentTarget。那么,当您可以直接获取 currentTarget 并仅检查该答案是否正确时,为什么要与 index 进行比较,您可以将样式应用于该按钮。希望有帮助!!
-
我认为 react 不喜欢使用 Event 属性,这就是为什么我将点击的答案作为参数传递。
-
没有。 React 喜欢玩事件,我的意思是这就是为什么他们创建了一个 Synthetic Event 包装器来为我们提供信息。如果您使用事件,没有编译器会抱怨。你会更容易获得目标并重新绘制它。你可以在 React 文档中阅读更多关于合成事件的信息。干杯!!
-
谢谢!所以我可以比较 if(clicked=e.target.id)?
-
正是@Robozombie。支持答案,以便将来对其他人有所帮助。谢谢
标签: javascript reactjs