Подтвердить что ты не робот

OnChange in React не фиксирует последний символ текста

Это моя функция рендеринга:

  render: function() {
    return  <div className="input-group search-box">
              <input
                onChange={this.handleTextChange}
                type="text"
                value={this.state.text}
                className="form-control search-item" />
              <span className="input-group-btn"></span>
        </div>
   }

и у меня есть это как обработчик событий:

   handleTextChange: function(event) {
     console.log(event.target.value);
     this.setState({
       text: event.target.value
     });
   }

Проблема заключается в том, что когда я "сохраняю" элемент или консоль .log печатает вывод, последний символ отсутствует - например, если я вхожу "первым", я буду распечатывать "firs" и должно быть другое ключевое событие для захвата последнего символа. Я пробовал onKeyUp - который не позволяет мне вводить что-либо, и я также пробовал onKeyDown и onKeyPress, которые ничего не выводят. Что здесь происходит и почему? и как я могу отобразить последнего персонажа?

4b9b3361

Ответ 1

Когда вы регистрируете состояние? Помните, что setState является асинхронным, поэтому, если вы хотите распечатать новое состояние, вам нужно использовать параметр обратного вызова. Представьте себе этот компонент:

let Comp = React.createClass({
  getInitialState() {
    return { text: "abc" };
  },

  render() {
    return (
      <div>
        <input type="text" value={this.state.text}
               onChange={this.handleChange} />
        <button onClick={this.printValue}>Print Value</button>
      </div>
    );
  },

  handleChange(event) {
    console.log("Value from event:", event.target.value);

    this.setState({
      text: event.target.value
    }, () => {
      console.log("New state in ASYNC callback:", this.state.text);
    });

    console.log("New state DIRECTLY after setState:", this.state.text);
  },

  printValue() {
    console.log("Current value:", this.state.text);
  }
});

Ввод a d в конце ввода приведет к тому, что на консоль будут записаны следующие файлы:

Value from event: abcd
New state DIRECTLY after setState: abc
New state in ASYNC callback: abcd

Обратите внимание, что в среднем значении отсутствует последний символ. Вот рабочий пример.

Ответ 2

Поскольку функция setState() в асинхронном режиме, я использовал await. Я добился этого с помощью async и await, вот мой код

render: function() {
    return  <div className="input-group search-box">
              <input
                onChange={(e) => {this.handleTextChange(e)}}
                type="text"
                value={this.state.text}
                className="form-control search-item" />
              <span className="input-group-btn"></span>
        </div>
   }

Функция handleTextCahnge:

handleTextChange = async function(event) {

     await this.setState({text: event.target.value});
     console.log(this.state.text);
   }

Ответ 3

Функция setState() в асинхронном режиме. Без использования обратного вызова вы можете использовать другую вспомогательную переменную для хранения и немедленного использования обновленного значения. Как:

export default class My_class extends Component{
constructor(props)
{
super(props):
this.state={
text:"",
};
this.text="";
}
 render: function() {
    return  <div className="input-group search-box">
              <input
                onChange={this.handleTextChange}
                type="text"
                value={this.state.text}
                className="form-control search-item" />
              <span className="input-group-btn"></span>
        </div>
   }

handleTextChange: function(event) {
     console.log(event.target.value);
     this.text = event.target.value;
     this.setState({
      text: event.target.value
     });
   }

Вы получите обновленное значение в переменной this.text немедленно. Но вы должны использовать this.state.text для отображения текста в вашем пользовательском интерфейсе.