В первой части серии От Ember к React я представил шаблон для повторного использования данных, полученных в компоненте верхнего уровня, в его дочерних элементах. Затем я начал понимать, что могу использовать этот паттерн, чтобы перенести еще больше идей из Ember в React! Вот пара, которую я использовал в последнее время:
Индикатор загрузки
Иногда мы хотим показать Индикатор загрузки, чтобы пользователи знали, когда обрабатывается запрос. Как предложено в этом посте, логика и разметка должны быть размещены в компоненте верхнего уровня для повторного использования последующими компонентами.
Как и раньше, я вспомнил удобную функцию Ember под названием Loading/Error Substates, уже встроенную в сам фреймворк. Оказывается, наш предыдущий шаблон Компонент и оболочка высокого порядка — идеальное место для повторения этого шаблона, поскольку нам не нужно повторять загрузчик в каждом отдельном компоненте:
Таким образом, мы можем повторно использовать логику загрузчика в дочерних компонентах на случай, если нам понадобится обратиться к другому удаленному API:
Обработка ошибок
Мы можем применить аналогичный шаблон для обработки ошибок, в этом случае я бы использовал общий модальный режим, чтобы показать потенциальные ошибки сети:
И вы можете использовать его в дочерних компонентах аналогичным образом, используя блок Try..Catch
:
*Update: я также считаю хорошей идеей разместить здесь логику Границы ошибок
Ничто не идеально…
Недостатком (без каламбура) этого шаблона является то, что нам нужно передавать реквизиты действий (showLoader
и showErrorModal
) каждому дочернему компоненту, и если наше дерево компонентов достаточно глубокое, это будет утомительной и подверженной ошибкам задачей, не говоря уже о супер многословном!
Решение этой проблемы в Ember заключалось в использовании надстройки под названием ember-route-action-helper, которая используется для всплывания действий к родительскому маршруту. Это возможно из-за экзистенциальной разницы между роутами и компонентами в объектной модели Ember, но, поскольку React состоит только из компонентов, мы не можем легко воспроизвести эту функцию… или можем? 🤔
Когда контекстный API?
Большинство этих подводных камней потенциально можно устранить с помощью React Context API, но опять же, я оставлю это на другой день 😬