React - очистка входного значения после отправки формы

У меня довольно глупая проблема. Я нахожусь в процессе создания моего первого приложения React, и у меня возникла небольшая проблема, из-за которой я не могу очистить свое значение ввода после отправки формы. Я попытался найти эту проблему, нашел несколько похожих тем, но я не смог ее решить. Я НЕ хочу менять состояние моего компонента/приложения, просто чтобы изменить значение ввода на пустую строку. Я попытался очистить значение ввода в моей функции onHandleSubmit(), но получил ошибку:

"Невозможно установить свойство 'значение' из неопределенного".

Мой компонент панели поиска:

import React, { Component } from "react";

class SearchBar extends Component {
  constructor(props) {
    super(props);

    this.state = {
      city: ""
    };

    this.onHandleChange = this.onHandleChange.bind(this);
    this.onHandleSubmit = this.onHandleSubmit.bind(this);
  }

  render() {
    return (
      <form>
        <input
          id="mainInput"
          onChange={this.onHandleChange}
          placeholder="Get current weather..."
          value={this.state.city}
          type="text"
        />
        <button onClick={this.onHandleSubmit} type="submit">
          Search!
        </button>
      </form>
    );
  }

  onHandleChange(e) {
    this.setState({
      city: e.target.value
    });
  }

  onHandleSubmit(e) {
    e.preventDefault();
    const city = this.state.city;
    this.props.onSearchTermChange(city);
    this.mainInput.value = "";
  }
}

export default SearchBar;

Ответ 1

У вас есть контролируемый компонент, значение input которого определяется значением this.state.city. Поэтому, как только вы отправите заявку, вы должны очистить свое состояние, которое автоматически очистит ваш ввод.

onHandleSubmit(e) {
    e.preventDefault();
    const city = this.state.city;
    this.props.onSearchTermChange(city);
    this.setState({
      city: ''
    });
}

Ответ 2

Поскольку поле ввода является управляемым элементом, вы не можете напрямую изменить значение поля ввода без изменения состояния.

Также в

onHandleSubmit(e) {
    e.preventDefault();
    const city = this.state.city;
    this.props.onSearchTermChange(city);
    this.mainInput.value = "";
  }

this.mainInput не ссылается на вход, поскольку mainInput - это id, вам нужно указать ссылку на ввод

<input
      ref={(ref) => this.mainInput= ref}
      onChange={this.onHandleChange}
      placeholder="Get current weather..."
      value={this.state.city}
      type="text"
    />

В вашем текущем состоянии лучший способ - очистить состояние, чтобы очистить входное значение

onHandleSubmit(e) {
    e.preventDefault();
    const city = this.state.city;
    this.props.onSearchTermChange(city);
    this.setState({city: ""});
  }

Однако, если вы по какой-то причине хотите сохранить значение в состоянии, даже если форма отправлена, вы скорее сделаете вход неконтролируемым

<input
      id="mainInput"
      onChange={this.onHandleChange}
      placeholder="Get current weather..."
      type="text"
    />

и обновить значение в состоянии onChange и onSubmit очистить ввод, используя ref

 onHandleChange(e) {
    this.setState({
      city: e.target.value
    });
  }

  onHandleSubmit(e) {
    e.preventDefault();
    const city = this.state.city;
    this.props.onSearchTermChange(city);
    this.mainInput.value = "";
  }

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

Ответ 3

this.mainInput фактически не указывает на что-либо. Поскольку вы используете управляемый компонент (т. this.state.city Значение ввода получается из состояния), вы можете установить this.state.city null:

onHandleSubmit(e) {
  e.preventDefault();
  const city = this.state.city;
  this.props.onSearchTermChange(city);
  this.setState({ city: '' });
}

Ответ 4

В своей функции onHandleSubmit установите свое состояние в {city: ''} следующим образом:

this.setState({ city: '' });

Ответ 5

Приведенные выше ответы являются неправильными, все они будут работать в режиме погоды или не будет успешной отправки... Вам нужно написать компонент ошибок, который будет получать любые ошибки, а затем проверить, есть ли ошибки в состоянии, если нет, то очистите форму....

используйте .then()

Пример:

 const onSubmit =  e => {
e.preventDefault();
const fd = new FormData();
fd.append("ticketType", ticketType);
fd.append("ticketSubject", ticketSubject);
fd.append("ticketDescription", ticketDescription);
fd.append("itHelpType", itHelpType);
fd.append("ticketPriority", ticketPriority);
fd.append("ticketAttachments", ticketAttachments);
newTicketITTicket(fd).then(()=>{
  setTicketData({
    ticketType: "IT",
    ticketSubject: "",
    ticketDescription: "",
    itHelpType: "",
    ticketPriority: ""
  })
})  

};