Работа с организацией и помогая им мигрировать свое приложение на основе jQuery, чтобы реагировать. Старая версия представляет собой монолит, созданный в Django, состоящий из статического HTML для отдельных страниц с jQuery, посыпанным по всему. Миграция проводится на небольших шагах с инъекцией реагирования на отдельные страницы и создание приложения на странице.
Сохранение его простым, общая структура приложений, разработанная для 1 контейнерного компонента и множественные презентационные компоненты. Состояние приложения инициализируется в компоненте контейнера, а части его передаются как реквизиты для соответствующих презентационных компонентов.
Больше на контейнерах и презентационных компонентах
Проблема: несколько вызовов Async, инициализируя состояние приложения случайным образом.
Ниже приведено состояние на странице детализации продукта.
this.state = { product_detail: {}, comments: [] }
Поскольку приложение полностью находятся на основе передней работы, все вызовы AJAX начнутся в ComponentDidMount ()
Способ жизненного цикла компонента. Индивидуальные методы создают вызовы AJAX, чтобы получить соответствующую часть состояния и устанавливать данные в состоянии.
getCommentsData () { this.makeAjaxCall(`https://reqres.in/api/users`, `GET`) .then(data => { this.setState({comments: data}) }); } getProductData () { this.makeAjaxCall(`https://reqres.in/api/users/2`, `GET`) .then(data => { this.setState({product_detail: data}) }); } componentDidMount () { this.getCommentsData(); this.getProductData(); }
Это привело к получению государства несколько раз в нескольких местах, и я понятия не имел, какой звонок Ajax будет окончен первым.
Добавьте к этому, установка состояния несколько раз повторно отображаемое приложение, предоставляющее ему милый эффект каждый раз, когда AJAX Call закончен.
Реализация: инициализация государства должно произойти только один раз и только в одном месте.
Это называется первоначальным состоянием по причине (дух!). Состояние не должно быть инициализировано несколько раз и не должно быть инициализировано случайно в случайных местах.
Решение: обещают. Все к спасению
С реализацией раствор был довольно простым. Мне нужно было найти способ ждать всех вызовов Ajax, чтобы завершить и установить состояние один раз только тогда, когда все вызовы AJAX закончены.
Скажи привет Обещать. Все
Изменение было довольно простым, вместо того, чтобы заполнить вызовы AJAX в отдельных методах, которые мне нужно вернуть Обещание
от них
getProductData () { return this.makeAjaxCall(`https://reqres.in/api/users/2`, `GET`); } getCommentsData () { return this.makeAjaxCall(`https://reqres.in/api/users`, `GET`); }
И в ComponentDidMount ()
использовать Обещание. Все ()
ждать, пока индивидуальные обещания закончат, а затем по-настоящему прояснить государство.
componentDidMount () { Promise.all([this.getProductData(), this.getCommentsData()]) .then(([product_detail, comments]) => { this.setState({ product_detail, comments }); }); }
Вывод: окончательное рабочее решение
JS Widdle
Спасибо за чтение