【问题标题】:How can i target specific button's styling with onClick function if i have the same onClick function attached to multiple buttons?如果我将相同的 onClick 函数附加到多个按钮,如何使用 onClick 函数定位特定按钮的样式?
【发布时间】:2021-07-19 22:40:30
【问题描述】:

我正在尝试在 React 中创建一个 Trivia 应用程序,但在用户从给定选项中选择答案后,我无法更改背景颜色。我正在尝试通过一些个人更改来做 freeCodeCamp 的测验应用程序。

它目前所做的是将每个按钮着色为绿色或红色,具体取决于答案是正确还是错误,我只想针对已通过 backgroundColor 更改单击的特定按钮,其余部分保持原样.

所以,在这里我有一个 div,我在其中绘制了不同按钮上的答案选项:

        <div className='answer-Section'>
          {currentQuestion.answerOptions.map((elem) => (
            <button
              className='answer-Button'
              onClick={() => handleAnswerClick(elem.isCorrect)}
              style={{
                backgroundColor: isAnswered ? bgAnswered : bgNeutral,
              }}
            >
              {elem.answerText}
            </button>
          ))}
        </div>

这里是映射按钮上的 onClick 事件处理程序:

const handleAnswerClick = (isCorrect) => {
setIsAnswered(true)
isCorrect ? setScore(score + 1) : setScore(score)
isCorrect ? setBgAnswered('green') : setBgAnswered('red')
setTimeout(() => findNextQuestion(), 1000)}


const findNextQuestion = () => {
setIsAnswered(false)
const nextQuestion = currentQuestionNumber + 1
if (nextQuestion === questions.length) {
  setShowScore(true)
} else {
  setCurrentQuestionNumber(nextQuestion)
}}

【问题讨论】:

  • 用户可以尝试多次回答还是只有一次机会?
  • 不行,他们只能回答一次。
  • 好的,我现在尝试创建一个答案
  • 谢谢,不胜感激。

标签: javascript reactjs


【解决方案1】:

有几种方法可以做到这一点。最简单的方法是不仅存储是否问题被回答,而且还存储选择了哪个答案。在下面的代码中,我也避免使用 bgAnswered 状态变量,而是只计算所需的内联颜色。

        [answer, setAnswer] = useState();
        //...
        <div className='answer-Section'>
          {currentQuestion.answerOptions.map((elem, i) => (
            <button
              className='answer-Button'
              onClick={() => handleAnswerClick(elem.isCorrect, i)}
              style={{
                backgroundColor: answer === i ? (elem.isCorrect ? 'green' : 'red') : bgNeutral,
              }}
            >
              {elem.answerText}
            </button>
          ))}
        </div>
const handleAnswerClick = (isCorrect, i) => {
  setAnswer(i);
  if (isCorrect) setScore(score + 1);
  setTimeout(() => findNextQuestion(), 1000)
};

另一种选择是将bgAnswered 制成一个值数组,每个答案一个值。但在这种情况下,这似乎是不必要的。

【讨论】:

  • 谢谢,它工作得几乎完美。只需要重置答案状态变量,因为当您单击它时,它会保留下一个问题的答案并突出显示它是对还是错。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-08
  • 1970-01-01
  • 2013-02-09
  • 2021-06-18
  • 2019-01-11
相关资源
最近更新 更多