Якщо взяти одну річ, яку згадують на багатьох форумах по React або фронтендів вобщем, то це буде питання: як зробити AJAX запит в додатках на React.
Найбільше замішання - це те, що насправді React часто підноситься як фреймворк, і люди працювали з фреймворкамі, такими як Angular звикли працювати з викликами API, з такими речами як $ http і схожими helpers бібліотеками, пропонованими самим Angular. У випадку з React інша справа, так як React - це "просто" view бібліотека з керуванням стану і lifecycle методами.
Так як же зробити AJAX запит, якщо бібілотека не надає вам цього з коробки?
Ви в праві вільно використовувати 3rd party бібліотеки (інші невеликі бібіліотека, вирішальні певні завдання). Ви можете використовувати нативну реалізацію браузера fetch (також ви можливо захочете включити whatwg-fetch polyfill. Для підтримки fetch в старих браузерах) або використовувати axios. Я особисто віддаю перевагу останнім, так як axios має простий API і працює в більшості браузерах.
Все що вам потрібно, щоб працювати з axios, це знати як працюють promisses - навіть якщо ви коли-небудь використовували JQuery.ajax, то ви вже повинні розуміти що і як.
Давайте пояснимо основи використання на простому GET запиті:
Ми отправялем GET запит на певний URI і логіруем відповідь. Axios вже має на увазі, що відповідь буде в форматі JSON об'єкта, тому нам не потрібно вказувати будь-яких додаткових опцій.
Як ви можете бачити, створення AJAX запиту в React не сильно відрізняється від його створення в JQuery або Angular. Реальний питання - це.
Коли або де робити AJAX запит?
Коли ви розробляєте свій додаток і workflow, ви повинні заздалегідь продумати як буде влаштований прийом / передача даних (data flow) у програмі:
- Які з компонентів будуть мати можливість відправляти запит на отримання даних?
- Як дані будуть передаватися іншим компонентам?
- Чи буде реалізовано більше ніж одну дію, яке може бути корисно в інших випадках (завантаження додаткової інформації про піст в цю сторінку, завантаження інформації в Гланом сторінку, показ схожих постів)?
Тут наведено пара хороших способів "best practice" для вирішення даного завдання, де використовувати AJAX запит:
componentWillMount
Ваш компонент, як в нашому прикладі
У разі отримання відповіді (response), щоб передати ID як props, наш компонент буде посилати AJAX запит і потім, в методі компонента render () буде перевірятися, якщо data (дані) уставнолени в state, то буде рендери контент.
Здається що це ідеальне чинне рішення, але також це вважається анти-патерном, так як у нас зараз є піднесений до контейнера компонент, який пов'язаний з відображенням елемента в його реалізації, це зменшуються можливість повторного використання даного компонента.
Прімічаніе перекладача: В даному випадку мається на увазі, що якщо ми наприклад, будемо використовувати компонент BlogPost в іншому місці, нам також потрібно буде передати id статті і кожен компонент буде кожен раз робити AJAX запит на отримання одних даних, актуальних для нього.
Передача даних від батьківського компонента через props
Замість того, щоб робити батьківським компонентом, компонент
Коли я використовую поняття батьківський компонент, ви все ще повинні пам'ятати зауваження з попереднього способу AJAX запиту про прив'язку компонента до його реалізації. Ви повинні по можливості уникати використання безлічі контейнерів / розумних компонентів у вашому додатку.
Використання state manager'а такого, як flux, redux або mobx.
На додаток до цього рішення, буде бонусом той факт, що зараз ми зможемо робити AJAX запит з будь-якого місця в додатку, яке нам сподобається (при зміні URL, в методі componentWillMount, при подію на сервері через сокети) і коли ми отримаємо наші дані і передамо їх в store, наші компоненти відповідно теж оновляться.
Додаток 2 - робимо це красиво
Тепер, коли ми знаємо як отримати дані через API, ми повинні переконатися, що користувач знає, що щось сталося. Для цього трохи підкоригуємо render () метод:
Завдяки перевірки чи є дані, ми можемо вирішити чи показувати контент користувачеві або відобразити що контент ще завантажується. Приклад реалізації даного рішення:
Виглядає краще, правда? Подивіться ось це: facebook-content-placeholder-deconstruction. щоб зрозуміти як facebook знущається над постом, поки той вантажиться. Звичайно ви можете додати будь-який прелоадер, який захочете