Я новичок в реакции и пытаюсь создать базовое приложение 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;
};
@DavidLazar Изучив ваш комментарий, я снова посмотрел на то, как я это делаю. После запроса POST к 'https://' + domain + '/admin/oauth/access_token'; я делаю res.redirect('/'), что означает, что я теряю домен магазина. По этой причине я сохраняю его в сеансе. Отсюда необходимость запроса к серверу для его получения. Я думаю, мне нужно избавиться от перенаправления и обслуживать приложение из местоположения &redirect_uri=https://${appDomain}/shopify/auth
Идея состоит в том, чтобы использовать вашу сессию. Когда вы получаете токен oAuth, вы сохраняете его вместе с доменным именем магазина myshopify.com. Таким образом, когда продавец нажимает на ваше приложение, вы сопоставляете предоставленное название магазина с вашей БД и получаете существующий токен, настраиваете сеанс и продолжаете.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Простой способ сделать это - сохранить атрибут 'isLoading' в состоянии вашего компонента, для которого изначально установлено значение true.
Как только ваш компонент завершит выборку необходимых данных, вызовите this.setState({isLoading: false}).
Тогда метод рендеринга вашего компонента должен выглядеть примерно так:
render() {
const { isLoading } = this.state;
if (isLoading) {
return <span>loading...</span>
}
return <AppProvider {...props}/>
}
Таким образом, ваше приложение не будет пытаться подключиться к сервису Shopify, пока оно не закончит выборку данных.
Конечно, вы можете сделать возвращаемое значение render любым, может быть, поместите туда значок загрузки / анимацию или просто верните пустой <div>.
О, это фантастическая идея, и она дает пользователю обратную связь во время асинхронного запроса, что что-то происходит! Спасибо
@andrew Конечно. Это приятный маленький трюк в любое время, когда компоненту необходимо получить и отобразить данные, чтобы ваше приложение выглядело хорошо даже во время выборки.
Нет никакого смысла ждать, пока можно будет запросить домен с сервера? Когда бы у вас когда-либо поступал вызов Shopify в ваше приложение без названия магазина в полезной нагрузке? Все настройки Shopify EASDK предоставляют вам магазин. Ваш вариант использования или то, как вы используете EASDK, кажутся странными. Не могли бы вы вкратце объяснить, что вы пытаетесь делать с Polaris?