Почему <input />
и this.state.input
не находятся в одном и том же месте в памяти?
input
является элементом html DOM, а другой, this.state.input
это javascript объект, это две совершенно разные вещи. Единственное, что связано с этими двумя понятиями, - это синтаксис JSX и структура реагирования.
Почему ввод может быть очищен перед объединением сообщений?
В реагировании обрабатываются состояния и параметры как неизменяемые объекты, так и реагируют состояния работ между циклами рендеринга. Все обновления состояния в любом одном цикле ставятся в очередь и обрабатываются пакетно для следующего цикла рендеринга. Установка this.state.input
для пустой строки и добавление ее в массив this.state.messages
ставятся в очередь для обработки для следующего визуализированного представления.
Ниже приведены все эквивалентны с точки зрения следующего вычисленного состояния:
this.setState({
input: '',
messages: [...this.state.messages, this.state.input],
});
и
this.setState({
messages: [...this.state.messages, this.state.input],
input: '',
});
и
this.setState({ input: '' });
this.setState({
messages: [...this.state.messages, this.state.input],
});
и даже
this.setState({ input: '' });
this.setState({
messages: [...this.state.messages, this.state.input],
});
this.setState({
messages: [...this.state.messages, this.state.input],
});
последний из них может вас удивить ( что!? ), но помните, что состояние состояния является неизменным и обрабатывается пакетно, поэтому в случае обновления messages
, this.state.messages
и this.state.input
имеют одинаковые значения в обоих вызовах, и, таким образом, последний из них вызывает состояние. Кстати, (и за пределами этого вопроса) обновления функционального состояния помогают решить проблему с помощью последнего примера.