[英]React - how to access other elements in handleClick?
我正在迭代一个数组,对于每个元素,我将它传递给一个handleClick
function。 问题是,在那个 handleClick function 里面,我如何访问元素的 rest?
const listOfAnswers = questions[questionNumber].possibleAnswers.map((obj, i, arr) => {
return (
<Button
key={i}
style={
{
margin: '15px 0',
}
}
variant='contained'
onClick={e => handleClick(obj, e, arr)}
>
{obj.answer}
</Button>
)
})
const handleClick = async (obj, e, arr) => {
const { isCorrect, answer } = obj
if (isCorrect) {
setScore(score + 1)
e.target.style.backgroundColor = 'green'
await delay(100)
e.target.style.backgroundColor = ''
} else {
e.target.style.backgroundColor = 'red'
await delay(100)
e.target.style.backgroundColor = ''
}
nextQuestion()
}
我想做的是:当用户点击正确的答案时,该按钮变为绿色。 这很容易实现。 当用户点击错误的答案时,它会变成红色。 实现起来也很简单。 但我想要的是:当用户点击错误的答案时,我希望正确的答案变成绿色。 为此,我认为我需要能够访问元素的 rest,因为在handleClick
function 中,您只能访问单个单独的元素。
有多种方法可以做到:
answer
(初始化为未定义)。 您的 handleClick 会将此 state 设置为用户选择的答案。 然后,如果定义了answer
,则以正确按钮的样式(在您的边距旁边)传递一个绿色背景颜色。 在obj.answer === answer
的按钮上,如果 obj.isCorrect 为 false,则设置红色背景颜色。 (请注意,您需要在nextQuestion
answer
state 重置为未定义)ref
添加到正确答案按钮( https://reactjs.org/docs/refs-and-the-dom.html ),在 handleClick 上,您可以设置ref.current.style.background
。以下假设存在唯一的正确答案:
const correctAnswerRef = useRef(null);
const listOfAnswers = questions[questionNumber].possibleAnswers.map((obj, i, arr) => {
return (
<Button
key={i}
ref={obj.isCorrect ? correctAnswerRef : undefined}
style={
{
margin: '15px 0',
}
}
variant='contained'
onClick={e => handleClick(obj, e, arr)}
>
{obj.answer}
</Button>
)
})
const handleClick = async (obj, e, arr) => {
const { isCorrect, answer } = obj
// always set current answer to green
correctAnswerRef.current?.style.backgroundColor = 'green'
if (isCorrect) {
setScore(score + 1)
} else {
e.target.style.backgroundColor = 'red'
}
await delay(100)
e.target.style.backgroundColor = '';
correctAnswerRef.current?.style.backgroundColor;
nextQuestion()
}
const [clicked, setClicked] = useState(-1); const listOfAnswers = questions[questionNumber].possibleAnswers.map((obj, i, arr) => { return ( <Button key={i} style={ { margin: '15px 0', color: clicked == -1? "#ffffff": clicked == i && obj.isCorrect? "#00ff00": cliked?= i: "#ffffff". "#ff0000" } } variant='contained' onClick={e => handleClick(i)} > {obj.answer} </Button> ) }) const handleClick = async (i) => { setClicked(i) nextQuestion() }
const [clicked, setClicked] = useState(-1); const listOfAnswers = questions[questionNumber].possibleAnswers.map((obj, i, arr) => { return ( <Button key={i} style={ { margin: '15px 0', color: clicked == -1? "#ffffff": clicked == i && obj.isCorrect? "#00ff00": cliked?= i: "#ffffff". "#ff0000" } } variant='contained' onClick={handleClick} > {obj.answer} </Button> ) }) const handleClick = (e) => { setClicked(e.target.key) }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.