Я видел примеров , показывающих, как реализовать двустороннее связывание в React, но никто не объясняет, как эта функция на самом деле функционирует внутри.
В этом примере codepen взято с веб-сайта React, если вы закомментируете строку 11:
handleChange(event) {
// this.setState({value: event.target.value});
}
Вы заметите, как React применяет двухстороннее связывание, убедившись, что представление не обновляется способом, несовместимым смодель данных даже после того, как пользователь непосредственно изменяет поле ввода.Но как это происходит?
Учитывая, что event.target.value
имеет ввод, который пользователь только что ввел в область действия handleChange
, но, тем не менее, становится пустым в представлении, это означает, что в какой-то момент значение было сброшенопо реакции.Кроме того, это не просто сброс значения на пустое, а в соответствии с последней моделью данных, это можно проверить, внеся следующие изменения в код:
constructor(props) {
super(props);
this.state = {value: ''};
this.handleChange = this.handleChange.bind(this);
this.handleSubmit = this.handleSubmit.bind(this);
this.counter = 0;
}
handleChange(event) {
if (this.counter < 3) {
this.setState({value: event.target.value});
this.counter++;
}
}
На этот раз поле ввода изменяет первые тривремя от времени, а затем сбрасывается в соответствии с последним состоянием модели.
Мне кажется следующее:
- Элемент HTML изменяется в соответствии с пользовательским вводом.
- Обработчик события "onchange" сработал.
- Состояние НЕ обновлено.
- Поскольку состояние не было обновлено, React отображает кэшированное представление компонента Virtual-DOM для элемента Real-DOMэто было только что изменено пользователем.
- React обновляет атрибуты элемента Real-DOM в соответствии с его представлением Virtual-DOM.
Если состояние было изменено, токэшированное представление Virtual-DOM было бы «загрязнено», и это вызвало бы повторную визуализацию виртуального элемента.Тем не менее, остальная часть потока, который я описал выше, все равно будет применяться, означая, что новый HTML-узел не был бы создан, и только атрибуты существующего были бы обновлены (при условии, что тип элемента, например, <input>
, didn 'изменить).
Это мое лучшее предположение относительно того, каким может быть внутренний механизм этой функции.Пожалуйста, дайте мне знать, если я ошибаюсь, и если да, то каков реальный ответ на вопрос.
Спасибо!