Состояние реакции продолжает сбрасываться при отправке формы. Как сохранить состояние?

Я пытаюсь научиться 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
    }
}

}

JS - События опций формы
JS - События опций формы
В продолжение предыдущей статьи CSS - стили, связанные с вводом формы , в этой статье мы будем использовать JS для взаимодействия с формами, на этот...
CSS - Стили, связанные с вводом формы
CSS - Стили, связанные с вводом формы
Общими стилями ввода для форм являются Input (включая Text, Radio, checkbox), Select и Textarea, из которых Input относительно прост, поэтому в этой...
Создание многостраничной формы заявления о приеме на работу с помощью Angular
Создание многостраничной формы заявления о приеме на работу с помощью Angular
Наличие на корпоративном сайте форм заявлений о приеме на работу, или "трудовых анкет", экономит время и деньги как для соискателей, так и для...
2
0
1 676
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вам необходимо использовать preventDefault() для события, переданного в функцию onSubmit, чтобы избежать отправки веб-формы по умолчанию, поскольку вы получаете перезагрузку страницы.

updatePage(event) {
    event.preventDefault();

    this.setState(prevState => ({
      page: prevState.page + 1
    }))
}

Да, ты справился. Клянусь, я пробовал это где-то в течение вечера, но теперь это определенно работает. Спасибо!

Mike Weiss 17.06.2018 05:05

Это не решает эту ситуацию, но я собираюсь добавить его, поскольку он решил мой вопрос, который привел меня сюда

У меня была кнопка в форме для завершения действия без отправки, которое продолжало сбрасывать реакцию.

Не забудьте добавить type = "button", чтобы форма не отправлялась при нажатии кнопки.

<button type = "button" onClick = {(e) => {handleClick(e)}}>Expand Options</button>

Другие вопросы по теме