javascript 从列表中选择一个项目,如果选择了一个选项,则取消选择ReactJS中的所有其他选项

fquxozlt  于 2022-12-28  发布在  Java
关注(0)|答案(2)|浏览(151)

我正在使用Trivia API在ReactJS中制作一个测验项目。如果我单击4个选项中的一个选项,那么它应该被选中,同时取消选中所有其他选项。此外,如果我再次单击它,那么它应该被取消选中。我是一个完全的React初学者。请帮助我!!!

function Questionnaire(props){
    return(
           <div className="question">
                       <div className="ques">{props.ques}</div>
                       <ul className="options">
                           <li>{props.incorrAns[0]}</li>
                           <li>{props.corrAns}</li>
                            <li>{props.incorrAns[1]}</li>
                           <li>{props.incorrAns[2]}</li>
                       </ul>
            </div>          
    )
}
flseospp

flseospp1#

你可以用React的状态

function Questionnaire(props){
    const [selectedOption, setSelectedOption] = useState("")
    
    const setOptions = (opt) => {
        setSelectedOption(opt);
    }
    return(
           <div className="question">
                       <div className="ques">{props.ques}</div>
                       <ul className="options">
                           <li onClick={() => setOptions(props.incorrAns[0])}>{props.incorrAns[0]}</li>
                           <li onClick={() => setOptions(props.corrAns)}>{props.corrAns}</li>
                           <li onClick={() => setOptions(props.incorrAns[1])}>{props.incorrAns[1]}</li>
                           <li onClick={() => setOptions(props.incorrAns[2])}>{props.incorrAns[2]}</li>
                       </ul>
            </div>          
    )
}
z4iuyo4d

z4iuyo4d2#

首先,对于这类任务,我可能会使用<input type="radio">,你可以阅读关于here的内容。
但这里有一个可能的解决方案,您可以使用自己的代码

import { useState } from "react";

function Questionnaire(props) {
  const {
    corrAns,
    incorrAns,
    ques
  } = props;

  const [selectedAnswer, setSelectedAnswer] = useState("");

  const handleClick = (answer) => {
    if (answer !== selectedAnswer) {
      setSelectedAnswer(answer);
    } else {
      setSelectedAnswer("");
    }
  };

  return (
    <div className="question">
      <div className="ques">{ques}</div>
      <ul className="options">
        {[...incorrAns, corrAns].map((answer) => (
          <li
            key={answer.id}
            style={answer === selectedAnswer ? { color: "blue" } : null}
            onClick={() => handleClick(answer)}
          >
            {answer}
          </li>
        ))}
      </ul>
    </div>
  );
}

export default Questionnaire;

CodeSandbox
解释一下我们在这里做什么,首先我们解构props,这样它会更好地使用,我们设置一个名为selectedAnswer的状态,它将保存当前选择的答案。
我冒昧地使用了map()函数,通过将corrAnsincorrAns连接到一个数组中来减少<li>元素的写入次数。然后,我们设置了onClick函数,这样当您单击一个答案时,它会触发handleClick函数,检查您是否选择了不同的答案。如果是不同的答案,我们将突出显示新选择的答案。如果选择的答案与之前相同,我们将按要求删除突出显示的答案。

相关问题