【发布时间】:2018-08-12 01:01:06
【问题描述】:
我是 react 新手,我正在尝试使用 React 和 Polaris React 套件构建一个基本的 Shopify 应用程序。
TL:DR;
在从服务器异步获取数据之前,如何防止 React 组件呈现? 或 让 Polaris 应用连接到 shopify 服务的正确方法是什么?
完整说明
问题是渲染函数应该将存储域添加到<AppProvider/> 元素的属性中。 IE。 <AppProvider shopOrigin="https://user-store.myshopify.com"/> 但是,域名因使用该应用的商店而异。
鉴于 React 在客户端呈现,我需要向服务器发送请求以检索当前的商店域。但这会在应用程序渲染后发生:
render() {
return (
<AppProvider
shopOrigin={this.state.shop} {/* Null when first rendered */}
debug={true}
> ... </AppProvider>
这导致 Polaris 应用尝试使用 shop 域的 Null 值连接到 Shopify,然后一切都中断了。
我已经能够通过让渲染函数在第一次渲染时返回 Null 来防止这种情况发生,但这感觉有点 hacky
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.log(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 的方式看起来很奇怪。你能简单解释一下你想用北极星做什么吗?
-
@DavidLazar 在研究了您的评论后,我再次审视了我做事的方式。在向
'https://' + domain + '/admin/oauth/access_token';发出POST 请求后,我执行res.redirect('/'),这意味着我失去了存储域。出于这个原因,我将它存储在会话中。因此需要向服务器发出请求来检索它。我想我需要摆脱重定向并从&redirect_uri=https://${appDomain}/shopify/auth位置提供应用程序 -
这个想法是使用你的会话。当您获得 oAuth 令牌时,您会将其与商店 myshopify.com 域名一起保存。这样,当商家点击您的应用程序时,您将提供的商店名称与您的数据库匹配并获取现有令牌,设置会话并继续。
标签: javascript reactjs asynchronous shopify polaris