Я пытаюсь научиться React и борюсь с этим всю ночь. Следующий код предназначен для перебора моего массива вопросов и динамического обновления моего рендеринга, чтобы заменить сообщение, тип и имя каждого из моих элементов формы. Однако то, что продолжает происходить, и чего я не могу найти, так это то, что при каждой отправке страница обновляется за долю секунды до следующего объекта в массиве вопросов, но затем обновляется, и форма сбрасывается на страницу: состояние 0 с вопросом "сколько команд?" (вместо увеличения до вопроса «сколько раундов?», как предполагалось). Я попытался переместить состояние к родительскому элементу формы, но это закончилось тем, что я просто пнул консервную банку, и возникла та же проблема.
import React from 'react';
import ReactDOM from 'react-dom';
export class Form extends React.Component {
constructor(props) {
super(props);
this.state = {
questions : [
{ message: 'How many teams?',
type: 'number',
name: 'numberOfTeams'
},
{ message: 'How many rounds?',
type: 'number',
name: 'numberOfRounds'
},
{ message: 'How long for each round?',
type: 'number',
name: 'lengthOfRounds'
},
{ message: 'What is your team name?',
type: 'text',
name: 'teamName'
}
],
page : 0
}
this.updatePage = this.updatePage.bind(this);
}
updatePage() {
this.setState(prevState => ({
page: prevState.page + 1
}))
}
render() {
if (this.state.page < this.state.questions.length){
return (
<form onSubmit = { this.updatePage }>
<div className = "setup">
<div className = "setupInterior">
<h1>{ this.state.questions[this.state.page].message }</h1>
<input type = { this.state.questions[this.state.page].type } name = { this.state.questions[this.state.page].name }></input>
</div>
</div>
</form>
)
} else {
return null
}
}
}




Вам необходимо использовать preventDefault() для события, переданного в функцию onSubmit, чтобы избежать отправки веб-формы по умолчанию, поскольку вы получаете перезагрузку страницы.
updatePage(event) {
event.preventDefault();
this.setState(prevState => ({
page: prevState.page + 1
}))
}
Это не решает эту ситуацию, но я собираюсь добавить его, поскольку он решил мой вопрос, который привел меня сюда
У меня была кнопка в форме для завершения действия без отправки, которое продолжало сбрасывать реакцию.
Не забудьте добавить type = "button", чтобы форма не отправлялась при нажатии кнопки.
<button type = "button" onClick = {(e) => {handleClick(e)}}>Expand Options</button>
Да, ты справился. Клянусь, я пробовал это где-то в течение вечера, но теперь это определенно работает. Спасибо!