【问题标题】:How can I prevent a Shopify Polaris React app from connecting to Shopify service too soon?如何防止 Shopify Polaris React 应用过早连接到 Shopify 服务?
【发布时间】: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('/'),这意味着我失去了存储域。出于这个原因,我将它存储在会话中。因此需要向服务器发出请求来检索它。我想我需要摆脱重定向并从&amp;redirect_uri=https://${appDomain}/shopify/auth 位置提供应用程序
  • 这个想法是使用你的会话。当您获得 oAuth 令牌时,您会将其与商店 myshopify.com 域名一起保存。这样,当商家点击您的应用程序时,您将提供的商店名称与您的数据库匹配并获取现有令牌,设置会话并继续。

标签: javascript reactjs asynchronous shopify polaris


【解决方案1】:

一种简单的方法是在组件的状态中保留'isLoading' 属性,该属性最初设置为true

一旦您的组件完成获取所需的任何数据,请致电this.setState({isLoading: false})

那么你的组件的渲染方法应该是这样的:

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

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

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

这样,您的应用在获取数据之前不会尝试连接到 Shopify 服务。

当然,您可以随意设置render 的返回值,可以在其中放一个加载图标/动画,或者只返回一个空的&lt;div&gt;

【讨论】:

  • 哦,这是一个绝妙的主意,它在异步请求期间向用户提供了正在发生的事情的反馈!谢谢
  • @andrew 当然。在组件需要获取和显示数据的任何时候,这都是一个不错的小技巧,因此您的应用即使在获取时也看起来不错。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多