Вы используете метод map (), который в основном циклично обрабатывает массив, так что да, он отображает каждый вопрос в различной форме. Вы не должны ставить все вопросы в разные формы, просто оберните их все в один и удалите тег из QuizForm.
Кроме того, handleSubmit должен быть методом, который отправляет форму бэкэнду (или нам), и создает другой метод, такой как handleChange или что-то еще, который принимает аргумент и устанавливает состояние.
handleChange(questionName, selectedAnswer){
this.setState({...answers, {questionName, selected: selectedAnswer}})
}
таким образом, вы можете сохранить имя вопроса (идентификатор или что-то в этом роде было бы лучше) и выбрать ответ и передать его как реквизиты вашей QuizForm (которая также требует переименования в нечто вроде Вопроса) и проверить радио, если оно соответствует выбранному.
Ваш текущий компонент QuizForm должен выглядеть примерно так (который также должен быть функциональным компонентом, а не классом)
const radioButtons = [{id: 'first', value: 1}, id:'second', value: 2];
function Question({selectedAnswer, question, name, id}){
return (
<>
<label htmlFor={id}>{question}</label>
{radioButtons.map(({id: btnId, value}) =>
{<input type="radio" id={id.concat(btnId)}
{selectedAnswer === value ? checked : null}
name={name} value={value} />})}
</>
);
}
В этом примере вы должны передать идентификатор вопроса, имя, selectedAnswer и вопрос чтобы все отображалось правильно. Идентификатор будет использоваться для метки, поскольку он относится к идентификатору элемента, который должен быть уникальным на каждой странице.