Как я могу предотвратить слишком быстрое подключение приложения Shopify Polaris React к сервису Shopify?

Я новичок в реакции и пытаюсь создать базовое приложение Shopify, используя React и пакет Polaris React.

TL: DR;

Как я могу предотвратить рендеринг компонента React до тех пор, пока данные не будут получены асинхронно с сервера? ИЛИ Как правильно подключить приложение Polaris к сервису shopify?

Полное объяснение

Проблема в том, что функция рендеринга должна добавить домен магазина к атрибуту элемента <AppProvider/>. Т.е. <AppProvider shopOrigin = "https://user-store.myshopify.com"/> Однако домен различается в зависимости от магазина, в котором используется приложение.

Учитывая, что React отображается на стороне клиента, мне нужно отправить запрос на сервер, чтобы получить текущий домен магазина. Но это происходит после того, как приложение отрендерило:

render() {

    return (
      <AppProvider
        shopOrigin = {this.state.shop} {/* Null when first rendered  */}
        debug = {true}
      > ... </AppProvider>

Это приводит к тому, что приложение Polaris пытается подключиться к Shopify со значением Null для домена магазина, и все ломается.

Я смог предотвратить это, заставив функцию рендеринга возвращать Null при первом рендеринге, но это кажется хакерским.

 render() {   

    if (typeof this.state.shop === 'undefined') {/* true on first render */}
      return null; { /* prevent rendering at this stage */ }

    return (
      <AppProvider
        shopOrigin = {this.state.shop}
        debug = {true}
      > 

Вот асинхронная функция, которую я использую для получения домена с сервера.

 constructor() {
    super();

    this.state = {};
  }

  componentDidMount() {
    this.callApi()
      .then(res => this.setState(res))
      .catch(err => console.info(err));
  }

  callApi = async () => {
    const response = await fetch('/shopify/config');
    const body = await response.json();

    if (response.status !== 200) throw Error(body.message);

    return body;
  };

Нет никакого смысла ждать, пока можно будет запросить домен с сервера? Когда бы у вас когда-либо поступал вызов Shopify в ваше приложение без названия магазина в полезной нагрузке? Все настройки Shopify EASDK предоставляют вам магазин. Ваш вариант использования или то, как вы используете EASDK, кажутся странными. Не могли бы вы вкратце объяснить, что вы пытаетесь делать с Polaris?

David Lazar 12.08.2018 05:24

@DavidLazar Изучив ваш комментарий, я снова посмотрел на то, как я это делаю. После запроса POST к 'https://' + domain + '/admin/oauth/access_token'; я делаю res.redirect('/'), что означает, что я теряю домен магазина. По этой причине я сохраняю его в сеансе. Отсюда необходимость запроса к серверу для его получения. Я думаю, мне нужно избавиться от перенаправления и обслуживать приложение из местоположения &redirect_uri=https://${appDomain}/shopify/auth

andrew 12.08.2018 08:57

Идея состоит в том, чтобы использовать вашу сессию. Когда вы получаете токен oAuth, вы сохраняете его вместе с доменным именем магазина myshopify.com. Таким образом, когда продавец нажимает на ваше приложение, вы сопоставляете предоставленное название магазина с вашей БД и получаете существующий токен, настраиваете сеанс и продолжаете.

David Lazar 12.08.2018 21:51
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
3
590
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Простой способ сделать это - сохранить атрибут 'isLoading' в состоянии вашего компонента, для которого изначально установлено значение true.

Как только ваш компонент завершит выборку необходимых данных, вызовите this.setState({isLoading: false}).

Тогда метод рендеринга вашего компонента должен выглядеть примерно так:

render() {
    const { isLoading } = this.state;

    if (isLoading) {
        return <span>loading...</span>
    }

    return <AppProvider {...props}/>
}

Таким образом, ваше приложение не будет пытаться подключиться к сервису Shopify, пока оно не закончит выборку данных.

Конечно, вы можете сделать возвращаемое значение render любым, может быть, поместите туда значок загрузки / анимацию или просто верните пустой <div>.

О, это фантастическая идея, и она дает пользователю обратную связь во время асинхронного запроса, что что-то происходит! Спасибо

andrew 12.08.2018 04:13

@andrew Конечно. Это приятный маленький трюк в любое время, когда компоненту необходимо получить и отобразить данные, чтобы ваше приложение выглядело хорошо даже во время выборки.

Henry Woody 12.08.2018 04:15

Другие вопросы по теме