|
38 / 14 / 4
Регистрация: 28.01.2020
Сообщений: 170
|
||||||
Как работает setState()?04.04.2021, 21:57. Показов 1647. Ответов 8
Доброго времени суток!
Поясните, пожалуйста как работает метод setState() в данном коде.
Попытаюсь пошагово изложить, как я понимаю этот код. 1. Компонент SpeedRadar рендерит три элемента. Два SpeedSetter (забегая вперед - это будут input со span) и SpeedDetector (это будет div с текстом). 2. Следим за первым элементом. Т.е. за <SpeedSetter unit="KPH" speed={kph} onChangeSpeed={this.onChangeSpeedInKph}/>. Он передает в компонент SpeedSetter следующие props: {unit: "KPH", speed: {kph}, onChangeSpeed: {this.onChangeSpeedInKph}}. 3. Метод render() компонента Speedsetter возвращает <span>Введите скорость в "{UNIT[unit]}": </span> и <input value={speed} onChange={this.onChange}/>. 4.Оставим span в покое, так как там ничего не меняется и стало быть все просто. Следим дальше за input. У него два атрибута value={speed}(задает значение, что будет отображаться в input) и onChange={this.onChange}/>(обработчик события change). 5. В первый раз input рендерится со значением 0. Он возьмет это значение из переменной speed, которая в свою очередь берет его из this.props.speed ([I] let speed = this.props.speed;[I/]). В props.speed это speed={kph}. Смотрим, что находится в kph. Там вот такая запись: const kph = unit === 'MPH' ? сonvertSpeed(speed, convertToKph) : speed;. Стало быть при стартовом рендеринге первого input (с километрами в час) в kph попадет 0. Изначально первый input отобразиться с значением по умолчанию 0. 6. Когда мы в этом input сделаем изменения. Например, вставим туда копипастом 10, сработает атрибут onChange, который вызовет функцию onChange(e) {this.props.onChangeSpeed(e.target.value );}. Функция onChange вызовет через props функцию onChangeSpeedInKph(speed) {this.setState({unit: 'KPH', speed});} из SpeedRadar и передает ей аргументом 10. 7. И вот самое интересное (то, что мне непонятно). Каким-то образом setState из onChangeSpeedInKph затем переписывает this.state = {speed: 0, unit: 'KPH'} он становиться this.state = {speed: "10", unit: 'KPH'}. Но как это происходит? Мы же не написали this.setState({unit: 'KPH', this.state.speed = speed})? Мы написали this.setState({unit: 'KPH', speed}) Где speed это просто строка 10, как она смогла переписать this.state.speed? Похоже у меня критическое недопонимание как работает setState(). Объясните, пожалуйста.
0
|
||||||
| 04.04.2021, 21:57 | |
|
Ответы с готовыми решениями:
8
Асинхронность setState Установить setState через функцию
|
|
Особый статус
623 / 221 / 164
Регистрация: 18.11.2015
Сообщений: 1,086
|
||||||
| 05.04.2021, 09:02 | ||||||
|
Тут дело не в стейте, вот пример:
1
|
||||||
|
38 / 14 / 4
Регистрация: 28.01.2020
Сообщений: 170
|
|||||||||||||||||||||||||||||||
| 05.04.2021, 17:42 [ТС] | |||||||||||||||||||||||||||||||
|
Да, но тут у вас синтаксис с операторами расширения
Добавлено через 6 минут Пока не щелкнуло ![]() Добавлено через 16 минут Если в вашем примере не использовать ..., т.е. написать, как у меня, то вернет объект с двумя вложенными объектами:
Ладно бы так в setState у меня приходило:
0
|
|||||||||||||||||||||||||||||||
| 05.04.2021, 18:01 | |
Сообщение было отмечено Alborki как решение
Решение
Alborki, вы про shorthand property names?
https://developer.mozilla.org/... cript_2015 Или что-то другое непонятно?
1
|
|
|
38 / 14 / 4
Регистрация: 28.01.2020
Сообщений: 170
|
|||||||||||
| 05.04.2021, 22:01 [ТС] | |||||||||||
|
Непонятно почему это
0
|
|||||||||||
| 06.04.2021, 00:19 | |
|
Ну так это недра реакта.
Когда мы вызываем this.setState() с передачей туда объекта, то говорим реакту обновить состояние. Переданный в this.setState() объект не замещает старый объект, вместо этого реакт смотрит на свойства нового объекта и добавляет/меняет свйоства в "старом" объекте, а потом делает, если надо, очередной рендер компонента.
1
|
|
|
the hardway first
2475 / 1847 / 910
Регистрация: 05.06.2015
Сообщений: 3,610
|
||||||
| 06.04.2021, 09:33 | ||||||
|
Alborki, вам же сказали про shorthand property names
т. е.
1
|
||||||
|
38 / 14 / 4
Регистрация: 28.01.2020
Сообщений: 170
|
|
| 06.04.2021, 12:42 [ТС] | |
|
Ребят, всем спасибо!
Вроде понял. Все полезно и про "недра Реакта" и про shorthand property names. this.setState({unit: 'MPH', speed}); это тоже самое ,что и this.setState({unit: 'MPH', speed: 10});А то, что работает без ..., это как-то React сам там у себя под капотом в "недрах" делает.
0
|
|
| 06.04.2021, 12:43 | |
|
Не по теме: Alborki, в компонентах React объединяет состояние, в Redux заменяет полностью, смотрите не запутайтесь ;)
0
|
|
| 06.04.2021, 12:43 | |
|
Помогаю со студенческими работами здесь
9
Использование метода setState() Не обновляется компонент при setState (JS React)
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Символьное дифференцирование
igorrr37 13.02.2026
/ *
Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2).
Унарный минус обозначается как !
*/
#include <iostream>
#include <stack>
#include <cctype>. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога
Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
|
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
|