Запретить перезагрузку страницы при отправке формы

e.preventDefault(), прикрепленный к форме, не работает, и когда я нажимаю кнопку «Сохранить», страница перезагружается при отправке.

У меня есть отдельный компонент формы, который отлично работает, но я не могу исправить этот.

Что я делаю неправильно? Любая помощь приветствуется.

Мой код ниже

ТИА


class Todo extends Component {
  constructor(props){
      super(props);
      this.state = { isEditing: false, task: this.props.task }
      this.handleRemove = this.handleRemove.bind(this);
      this.toggleEdit = this.toggleEdit.bind(this);
      this.handleChangeEvent = this.handleChangeEvent.bind(this);
      this.handleSubmit = this.handleChangeEvent.bind(this);
    }
  handleRemove () {
      this.props.removeTodo(this.props.id)
  };

  toggleEdit () {
      this.setState ({
          isEditing: !this.state.isEditing
      });
  }
  handleChangeEvent(e) {
      this.setState({
          [e.target.name]: e.target.value
      });
  }
  handleSubmit(e) {
      e.preventDefault();
      this.props.updateTodo(this.props.id, this.state.task);
      this.setState({
          isEditing: false
      })
  }
  render() {
   let result; 
    if (this.state.isEditing) {
        result = (
        <div>
            <form onSubmit = {this.handleSubmit}>
                <input 
                    type='text'
                    name='task'
                    value = {this.state.task}
                    onChange = {this.handleChangeEvent}
                />
                <button>Save</button>
            </form>
        </div>
            )
    } else {
        result = (
        <div> 
            {this.props.task}
            <button onClick = {this.handleRemove}>X</button>
            <button onClick = {this.toggleEdit}>E</button>           
        </div>

        )
      }
    return result;
  }
}

export default Todo;

вы можете использовать console.info(e) в методе handleSubmit?

viciousP 21.06.2019 09:25

кажется, здесь работает stackblitz.com/edit/react-8cbglq

Junius L. 21.06.2019 09:30

он ничего не регистрирует.

user_119 21.06.2019 09:31
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
3
324
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

Похоже, в вашем constructor вы неправильно привязываете функцию:

this.handleChangeEvent = this.handleChangeEvent.bind(this);
this.handleSubmit = this.handleChangeEvent.bind(this);

Вместо этого вторая функция должна быть связана с handleSubmit

Я думаю, сначала стоит отметить, что без javascript (обычный html) элемент формы отправляется при нажатии на <input type = "submit" value = "submit form"> или <button> также отправляет форму </button>.

В javascript вы можете предотвратить это, используя обработчик событий и вызывая e.preventDefault() при нажатии кнопки или отправке формы. e — это объект события, передаваемый в обработчик события. С помощью react два соответствующих обработчика событий доступны через форму onSubmit, а другой — через кнопку onClick.

<Button color = "primary" onClick = {this.onClickPreventDefault}>onClickPreventDefault</Button>

Пример: http://jsbin.com/vowuley/edit?html, js, консоль, вывод

Изменены области:

  1. Конструктор не нужен
  2. Реквизит никогда не использовался в штате, теперь просто реквизит
  3. Не нужно создавать переменную result
  4. Движение к стрелочным функциям сокращает кодовую базу ??
  5. Переключите fn() - возьмите из предыдущих реквизитов, это быстрее!
  6. Отправьте fn() - активируйте свой реквизит после изменения состояния, так как setState() не является асинхронным

Другие области для улучшения:

  1. Вы можете сделать это компонентом без сохранения состояния с помощью useState()

    Надеюсь, это поможет ??

class Todo extends Component {
  state = {
    isEditing: false
  };

  handleRemove = () => {
    this.props.removeTodo(this.props.id);
  };

  toggleEdit = () => {
    this.setState(({ isEditing }) => ({
      isEditing: !isEditing
    }));
  };

  handleChangeEvent = ({ target }) => {
    this.setState({
      [target.name]: target.value
    });
  };

  handleSubmit = e => {
    e.preventDefault();

    this.setState(
      {
        isEditing: false
      },
      () => {
        this.props.updateTodo(this.props.id, this.props.task);
      }
    );
  };

  render() {
    const { task } = this.props;

    return this.state.isEditing ? (
      <div>
        <form onSubmit = {this.handleSubmit}>
          <input
            type = "text"
            name = "task"
            value = {task}
            onChange = {this.handleChangeEvent}
          />
          <button type = "sumbit">Save</button>
        </form>
      </div>
    ) : (
      <div>
        {task}
        <button onClick = {this.handleRemove}>X</button>
        <button onClick = {this.toggleEdit}>E</button>
      </div>
    );
  }
}

export default Todo;

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