#reactjs #forms #checkbox
Вопрос:
У меня есть динамическая форма со следующей реализацией. Проблема в том,что я хочу «проверить» флажок, существует ли ответ на этот «Идентификатор вопроса» в массиве ответов с выбранной опцией (т. Е. A, B). таким образом, условие проверки должно answers[index].userChoice.option
быть равно Object.keys(x).
import fieldsL from "./fields.json";
function App() {
let [Fields , setFields] = useState([]);
let [answers, setAnswers] = useState([]);
const updateAnswer = ((qid,option,optionValue) => {
let ans = answers;
let singleAns = {
questionId : qid,
userChoice:
{
option: option,
optionValue: optionValue,
isChecked: true
}
};
if(answers.length > Fields) return console.warn("Invalid Question ID")
if(answers.find((sp) => sp.questionId === qid)) {
var index = answers.map(function(x1) {return x1.questionId}).indexOf(qid);
answers[index].userChoice.option = option;
answers[index].userChoice.optionValue = optionValue;
console.log("Existing Answer Updated");
}
else ans.push(singleAns)
ans.sort((a, b) => parseFloat(a.questionId) - parseFloat(b.questionId));
setAnswers(ans)
console.log(answers)
})
useEffect(()=>{
console.log("useEffect")
setFields(fieldsL.data)
},[])
let Questions = fieldsL.data.question;
let displayFields = Questions.map((e,index)=>{
return <div key={index} >
<label className="label">{e.content}</label>
<div className="control">
{
e.radio? e.option.map((x,index2) => {
console.log(index)
//console.log(x)
return <div classID="field" key={index2}>
<div classID="control">
<label classID="checkbox">
<label> {Object.keys(x)[0]} </label>
<input type="checkbox" name="question" onChange={()=> updateAnswer(e.questionId,Object.keys(x)[0],Object.values(x)[0])}/>
amp;nbsp; {Object.values(x)[0]}
{
}
</label>
</div>
</div> }
) : <span>Empty</span>
}
</div>
</div>;
})
Комментарии:
1. Я предполагаю, что вы хотите добавить
checked
опору в свой входной компонент. Наверное, что-то в этом родеchecked={answers[index].userChoice.option === Object.keys(x)}
.2. @Крис, как бы я получил индекс прямо там.
3. А, понятно. Вам нужно сначала найти правильный ответ в массиве?
4. Точно, поскольку массив динамичен, есть вероятность, что для него нет значения. в этом случае он останется непроверенным, то же самое, если «опция» не совпадает.
Ответ №1:
На каждой итерации вашего цикла вы могли бы делать:
const value = Object.keys(x);
const answerIndex = answers.findIndex(a => a.userChoice.option === value);
а потом, когда ты вернешься:
<input
type="checkbox"
name="question"
checked={answerIndex >= 0}
onChange={()=> updateAnswer(e.questionId,Object.keys(x)[0],Object.values(x)[0])}
/>
Очевидно, было бы лучше, если бы ваши данные были структурированы по-другому, так как вышесказанное дало бы вам сложность O(2n), поскольку вы выполняли бы цикл внутри цикла. Однако для меньшего массива это вообще не должно быть проблемой.
Комментарии:
1. Я пробовал это раньше и сейчас, индекс возвращает -1 для каждой итерации. prnt.sc/1tfxnvg
2. @faqahatfared возможно, я неправильно понял, как моделируются ваши данные. Если ключ of
x
должен соответствовать auserChoice.option
, то это должно сработать.3. Правильным ключом будет Object.keys(x)[0] однако, похоже, он также не работает, можете ли вы предложить лучшую реализацию для этого?
4. Можете ли вы обновить свой вопрос с помощью консоли. лог-выходы
answers
(всей структуры) иObject.keys(x)
?