#javascript #arrays #reactjs #typescript #object
#javascript #массивы #reactjs #машинописный текст #объект
Вопрос:
Я работаю над react js и typescript. Я разрабатываю образовательное приложение, в котором администратор может добавлять один вопрос mcq и группу вопросов mcq. Я использовал ckeditor для написания вопроса mcq. когда я добавляю вопрос mcq, его мутация работает нормально. но в групповом вопросе это не работает. Когда я добавляю групповой вопрос, это комбинация двух вопросов mcq. каждый объект вопроса mcq имеет свою собственную пару ключ-значение. итак, в массиве имеется несколько объектов типа вопроса mcq. Теперь проблема в том, что когда я пишу что-то в одном объекте, его значение присваивается во всех других ключах объекта. предположим, я пишу что-то в question_text объекта object1, это значение также присваивается в question_text объекта object2, object3…. Другими словами, функция onchange применима к каждому объекту в массиве. Я не понимаю, как я могу это исправить. Пожалуйста, помогите мне в этом.
const handleMcqQuestionChange = (
value: string | number | string[],
name: string,
index: number
) => {
if (questionType === "MultipleChoice") {
//@ts-ignore
questionCopy[name as keyof McqQuestionInput] = value;
console.log("name and index", name, index)
setQuestion(questionCopy);
}
else{
//@ts-ignore
groupQuestion[0][name as keyof McqQuestionInput] = value;
console.log("group questions index", index)
// const groupQuestionData = [...mcqQuestions, questionCopy]
// console.log("mcq questions ", mcqQuestions);
setGroupQuestion(groupQuestion);
console.log("group questions", groupQuestion)
}
};
const handleChange = (
value: string | number,
name: string,
_index: number
) => {
if (questionType === "MultipleChoice") {
console.log("index mcq", _index)
const questionCopy: any = { ...question };
questionCopy[name] = value;
setQuestion(questionCopy);
}
else {
console.log("index group", _index)
const groupQuestionCopy: any = [ ...groupQuestion ];
groupQuestionCopy[_index][name] = value;
setGroupQuestion(groupQuestionCopy);
console.log("group question copy", groupQuestionCopy)
}
};
<Card>
<CardContent>
<CustomCKEditor
label="Instructions"
handleChange={(_event: any, content: any, _index: any) =>
handleInstructionsChange(
content amp;amp; content.getData(),
"instruction",
_index
)
}
initialState={question.questionText}
minHeight={500}
/>
</CardContent>
</Card>
{groupQuestion amp;amp;
groupQuestion.map((_questions, index) => (
<Card>
<CardContent>
<CustomCKEditor
label="Question"
handleChange={(_event: any, content: any) =>
handleMcqQuestionChange(
content amp;amp; content.getData(),
"questionText",
index
)
}
initialState={question.questionText}
minHeight={500}
/>
{question.options?.map((option: string, index: number) => (
<CustomCKEditor
label={`Option ${index 1}`}
handleChange={(_event: any, content: any) =>
handleOptionChange(content amp;amp; content.getData(), index)
}
initialState={option}
key={index}
/>
))}
<Typography variant="body1" style={{ marginTop: 10 }}>
Correct Option
</Typography>
<RadioGroup
row
name="correctOption"
value={groupQuestion[index].correctOption}
onChange={(_e, value) => {
// console.log(value, "value");
handleChange(Number(value), "correctOption", index);
}}
>
{question.options?.map((_option: string, index: number) => (
<FormControlLabel
value={index 1}
control={<Radio />}
label={`options ${index 1}`}
/>
))}
</RadioGroup>
<Fab size="small" color="primary">
<AddIcon onClick={handleAdd} />
</Fab>
<CustomCKEditor
handleChange={(_event: any, content: any) =>
handleMcqQuestionChange(
content amp;amp; content.getData(),
"hint",
index
)
}
label="Hint"
initialState={question?.hint}
/>
<CustomCKEditor
handleChange={(_event: any, content: any) =>
handleMcqQuestionChange(
content amp;amp; content.getData(),
"solution",
index
)
}
label="Solution"
initialState={question?.solution}
/>
</CardContent>
</Card>
Комментарии:
1. Я попытался запустить ваш фрагмент кода, но получил несколько ошибок. Можете посмотреть?
2. Я не предоставил полный код для запуска здесь. Он содержит различные компоненты и большой код, поэтому я не могу привести здесь весь код. Я предоставляю только некоторую часть кода. Если вы хотите, я буду рад встретиться с вами. Пожалуйста, поделитесь подробностями вашей встречи. Я поделюсь всем кодом целиком.