一些问题
- 每个问题的单选组名称都需要一个唯一的“名称”属性,因为选择任何问题的任何单选项目都会影响另一个问题。
解决方案:将 id 属性值附加到 name 属性以创建每个问题的唯一名称组
<input type="radio" name={`sport_${id}`} value="soccer" />
- 从问题中删除问题的逻辑不应存在于问题本身中。
可能的解决方案:提供卡片调用的方法及其 id 以从数组中删除自身(参见下面的代码)
- 您的物品的渲染有点奇怪。而是将数据存储在一个数组中,并在返回方法中处理渲染。 不要忘记您的密钥道具,否则您的选择将丢失(最好也将其存储在状态中)
exam.js
export const ExamProvider = ({ children }) => {
const [questions, setQuestions] = useState([]);
const removeQuestion = (id) => {
setQuestions((questions) => questions.filter((q) => q.id !== id));
};
return (
<Exam.Provider
value={{
questions,
setQuestions,
removeQuestion
}}
>
{children}
</Exam.Provider>
);
};
问题.js
const Question = ({ i, id}) => {
const { removeQuestion } = useContext(Exam);
return (
<div className="q-main">
{id}
<div className="q-title">
<h4>Which sport are you interested in the most?</h4>
<div className="options">
1. Soccer
<input type="radio" name={`sport_${id}`} value="soccer" />
2. Basketball
<input type="radio" name={`sport_${id}`} value="basketball" />
3. Bjj
<input type="radio" name={`sport_${id}`} value="bjj" />
4. MMA
<input type="radio" name={`sport_${id}`} value="mma" />
</div>
<div className="name">
Write your name:
<input type="text" />
</div>
</div>
<div className="delete">
<button className="deletebtn" onClick={() => removeQuestion(id)}>
Delete
</button>
</div>
</div>
);
};
export default Question;
ExamForm.js
import React, { useState, useContext } from "react";
import { Exam } from "../contexts/exam";
import uniqid from "uniqid";
import { IoIosAddCircle } from "react-icons/io";
import Question from "./Question";
const ExamForm = () => {
const exam = useContext(Exam);
const addQ = () => {
const id = uniqid();
exam.setQuestions((questions) => [
...questions,
{
id: id
}
]);
};
return (
<div className="form-main">
<button onClick={addQ} className="addqcs">
<IoIosAddCircle className="addicon" size={65} color="#0089d6" />
</button>
{exam.questions.map((q) => {
return <Question key={q.id} i={exam.questions.length + 1} id={q.id} />;
})}
</div>
);
};
export default ExamForm;
CodeSandbox