如何在嵌入式 React 应用程序的页面之间路由?

2023-12-02

背景:

我正在尝试在嵌入式 Shopify 应用程序中创建一些链接。

我明白我不能使用简单的<a>标签,因为 Shopify 嵌入式应用程序呈现为 iframe。

我在本教程中取得了一些进展,但我陷入了困境:https://theunlikelydeveloper.com/shopify-app-bridge-react-router/

我正在尝试做的事情:

我有 3 个页面(index.js、dashboard.js 和 support.js)。我想允许用户从一个页面导航到另一页面(使用链接和/或按钮)。

My Code:

通过遵循上面的教程,我已经做到了这一点:

// index.js
import { Page, Frame } from "@shopify/polaris";

const Index = () => {
  return (
    <Page>
      <Frame>
        {/* LINK TO DASHBOARD PAGE*/}
        {/* LINK TO SUPPORT PAGE */}
      </Frame>
    </Page>
  );
};

export default Index;
// routes.js
import React from "react";
import { Switch, Route, withRouter } from "react-router";
import { ClientRouter, RoutePropagator } from "@shopify/app-bridge-react";

function Routes(props) {
  const { history, location } = props;

  return (
    <>
      <ClientRouter history={history} />
      <RoutePropagator location={location} />
      <Switch>
        <Route path="/dashboard">
          <Dashboard />
        </Route>
        <Route path="/support">
          <Support />
        </Route>
        <Route path="/">
          <Home />
        </Route>
      </Switch>
    </>
  );
}

export default withRouter(Routes);
// link.js
import React from "react";
import { Link as ReactRouterLink } from "react-router";

const IS_EXTERNAL_LINK_REGEX = /^(?:[a-z][a-z\d+.-]*:|\/\/)/;

function Link({ children, url = "", external, ref, ...rest }) {
  if (external || IS_EXTERNAL_LINK_REGEX.test(url)) {
    rest.target = "_blank";
    rest.rel = "noopener noreferrer";
    return (
      <a href={url} {...rest}>
        {children}
      </a>
    );
  }

  return (
    <ReactRouterLink to={url} {...rest}>
      {children}
    </ReactRouterLink>
  );
}

export default Link;

额外的:

我相信我应该在某处实现以下代码,但我不知道它如何适合使用链接或按钮在页面之间导航的图片。

<AppProvider linkComponent={Link}>
  {/* App content including your <Route> components */}
</AppProvider>
  • Shopify 文档链接:https://polaris.shopify.com/components/struct/app-provider#section-using-linkcomponent

在构建嵌入式应用程序时,您可以使用应用程序桥实用程序进行客户端导航,如下所示在这个答案中

您只需要编辑_app文件并考虑从您的组件进行客户端导航(不能使用普通链接)


import {useEffect} from 'react';
import Router, { useRouter } from "next/router";
import { RoutePropagator as ShopifyRoutePropagator } from "@shopify/app-bridge-react";


function RoutePropagator () {
  const router = useRouter();
  const { route } = router;
  const app= useAppBridge();

  useEffect(() => {
    app.subscribe(Redirect.Action.APP, ({ path }) => {
      Router.push(path);
    });
  }, []);

  return app && route ? (
    <ShopifyRoutePropagator location={route} />
    ) : null;
}

然后在你的中使用这个组件_app file

_app.tsx


class MyApp extends App {

  render() {

    const { Component, pageProps, host } = this.props as any;

    return (
      <PolarisProvider i18n={translations}>

        <ShopifyBridgeProvider
          config={{
            apiKey: API_KEY,
              host,
              forceRedirect: true,
          }}
        >
          <RoutePropagator />
          <ApolloClientProvider Component={Component} {...pageProps} />

        </ShopifyBridgeProvider>

      </PolarisProvider>
    );
  }
}

现在您已经订阅了路由事件_app文件,我们只需要在您的页面中进行客户端导航

import {useAppBridge} from '@shopify/app-bridge-react';
import  { Redirect } from '@shopify/app-bridge/actions';

function IndexPage(props) {

  const app = useAppBridge();

  return (
    <>
      <div>{'you are in main page'}</div>

      <div onClick={() => {
        app.dispatch(Redirect.toApp({
          path: '/dashboard'
        }));
      }}>
        {'to dashboard'}
      </div>
    </>
  );

}

返回主页/路线,我发现它触发了oauth如果没有提供商店名称,那么我们将使用商店查询参数

 <div onClick={() => {
      app.dispatch(Redirect.toApp({
        path: '/?shop=<shop-name>.myshopify.com'
      }));
    }}>
      {'to main'}
 </div>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在嵌入式 React 应用程序的页面之间路由? 的相关文章

  • React setState回调返回值

    我是 React 新手 我希望实现这种流程 set the state execute a function f an async one which returns a promise set the state again return
  • React-Redux:绑定按键操作以启动减速器序列的规范方法是什么?

    这是一个关于react redux的新手问题 我花了几个小时四处搜寻才发现 所以我发布了这个问题 然后为后代回答 也可能是代码审查 我正在使用 React Redux 创建一个游戏 我想使用 WASD 键在小地图上移动角色 这只是更大努力的
  • 如何使用 React 制作垂直选项卡

    有人可以为我提供一种使用 React 创建垂直选项卡的方法吗 我尝试了各种npm包 如react web tabs reactstrap和react bootstrap 最后两个只有水平选项卡的示例 React web tabs在其文档中有
  • onMouseEnter 和 onMouseLeave 未按预期运行

    我正在尝试为我的组件模拟悬停效果 然而 onMouseEnter Leave 事件没有按预期工作 现在我试图让它简单地 console log 一个字符串来检查它是否正常工作 但什么也没有发生 目的是我可以在悬停时更改其背景颜色 我尝试通过
  • Recoil 中的动态原子键

    我正在尝试创建一个动态表单 其中表单输入字段是根据 API 返回的数据呈现的 由于atom需要有一个唯一的键 我尝试将它包装在一个函数中 但是每次我更新字段值或重新安装组件 尝试更改选项卡 时 我都会收到一条警告 我在这里做了一个小的运行示
  • 玩笑错误 TypeError: (0 , _jest.test) 不是函数

    我收到错误 类型错误 0 jest test 不是一个函数 当尝试使用时npm test 我认为这可能与配置有关 我该如何解决这个问题 File sum js function sum a b return a b export defau
  • 如何解构 React props 并仍然访问其他 props?

    我很好奇如果我想要所有的 props 但也想要解构单个属性 那么组件的参数 props 是否可以像导入一样解构 我想这更像是一个 JavaScript 问题 而不是一个 React 问题 但是举个例子 import React useEff
  • 在电子生成器反应电子应用程序后,在 Windows 中出现空白屏幕

    在电子生成器反应电子应用程序后 Windows 中出现空白屏幕 这是package json 在电子生成器反应电子应用程序后 Windows 中出现空白屏幕 name SmallBusinessManagement version 0 1
  • 运行故事书时出错 - sh: 1: start-storybook: 未找到

    我运行时遇到错误故事书 即使是干净的安装 npm run storybook gt storybook media programmersedge New Volume devs demostorybook gt start storybo
  • 过滤嵌套的 JSON 对象

    我有一个搜索栏 您可以在其中输入员工姓名 它应该根据过滤器返回姓名 我有一个嵌套的 JSON 对象 如下所示 我需要深入了解该对象以访问数组中的员工姓名 您可以看到我尝试实现的多个选项 它们已被注释掉 我的问题是代码没有过滤名称并返回所有名
  • 如何将 Twitter 小部件嵌入到 Reactjs 中?

    前往 Twitter 小部件网站 https publish twitter com https publish twitter com 我可以获得一个小部件添加到我的网站 我正在使用示例代码来尝试了解它的工作原理 a class twit
  • 如何正确地将代码从angularjs迁移到reactjs

    我正在尝试将代码从 Angular 迁移到 React 不确定这是否正确 只是需要一些帮助 看看我是否朝着正确的方向前进 我不知道角度 所以我很困惑 文本数据 是否类似于反应中的状态 我是否必须在顶部的状态中声明它 角度代码 scope t
  • 如何使用 React 动态设置 HTML5 数据属性?

    我想渲染一个 HTML5 属性
  • 你如何在react-native中实现捏合缩放?

    我一直在研究 PanResponder 我当前的工作假设是 我将检测是否有两个触摸正在向外移动 如果是 则增加元素大小onPanResponderMove功能 这似乎是一种混乱的方法 有没有更顺畅的方法呢 如果您只需要简单的捏缩放功能 只需
  • MUI DatePicker + date-fns 本地化问题

    当我使用MUI时出现这个问题日期选择器 with 本地化提供商 and 适配器日期Fns with 匈牙利 local
  • 如何从react-bootstrap复选框获取值/属性?

    我正在尝试使用反应引导复选框 https react bootstrap github io components html forms controls https react bootstrap github io components
  • React router v6 和路由内页面的相关链接

    您好 我正在尝试使用 React Router 将项目更新到 v6 我了解了基础知识 但在相关链接方面遇到了困难 我们有一个页面 通过 id 呈现给定项目的参考文档 该文档可以使用同级 ID 链接到其他 同级 材料 换句话说 用户可以在文档
  • 如何在create-react-app中注入没有REACT_APP前缀的dotenv变量?

    我有一个项目要从旧版 React 应用程序迁移到标准版create react app一个 未弹出 在遗留项目中 它手动加载 env文件与dotenv and dotenv expand并通过webpack注入DefinePlugin cr
  • 在 React 中使用 .less 文件

    我正在尝试将 less 文件与极简主义 React 应用程序一起使用 使用创建反应应用程序 我已经添加less and less loader to my 包 json以及我的模块规则webpack config js文件 然而 类引用并未
  • Next.js:错误:React.Children.only 期望接收单个 React 元素子元素

    我有一个名为Nav inside components目录及其代码如下所示 import Link from next link const Nav gt return div a Home a a About a div export d

随机推荐

  • 尝试更新 MongoDb 数组元素时出错

    在我的 Azure CosmosDb MongoApi 中 我有带有嵌入文档数组的 JSON id ObjectId 5a95745df886842904b82f71 token value1 channel value2 urls url
  • 在 IF 语句中对数组使用 DelayedExpansion 索引变量失败

    我有一个批处理文件 其中显示目录中的所有 pem 文件 为用户提供选择一个文件的选项 此时只是尝试使用他们选择的数字来显示他们选择的文件 ECHO数组的内容 我相信不知何故 因为它位于 IF 语句内部 所以索引变量 selectedPem
  • Swift:#warning 等效项

    Swift 有类似的 warning 吗 它只是用于在 Xcode 自己的 GUI 中显示警告 我也对是否有 error 等效项感兴趣 苹果表示 pragma mark 即将推出 可能与此相同 Edit 从 Swift 4 2 开始 语言级
  • R:使用 IFELSE 替代方案创建数据框的最快方法

    我有一个类似的问题 这个问题在这个线程上 使用 R 将矩阵中 但就我而言 假设我有更大的数据集和可变阈值 我需要使用同一数据帧第一列上的值创建一个数据帧 其中包含从条件中检索的每个值 每条线的这些值都不同 这是数据框的示例 SNP A1 A
  • C# 将密钥发送到其他应用程序到特定文本字段

    我需要使用 C 将密钥发送到其他应用程序到其他应用程序中的特定文本字段 那可能吗 如果是 有人可以给我示例代码吗 SendKeys只将击键组合发送到活动窗口 因此 如果您的 C 应用程序调用SendKeys在正确的时间运行 当用户将其他应用
  • Javascript 中的 String 是原始类型还是对象?

    Javascript 中的 String 是原始类型还是对象 消息人士称 Undefined Null Boolean Number 和 String 都是 Javascript 中的原始类型 但它说 String 也是一个对象 我很困惑
  • Java:扩展类加载器从 Java 13 中的哪里获取类?

    我能找到的所有文档都提到了 jre lib ext 文件夹 但我的 JRE 13 安装中不存在该文件夹 我猜想在 Java 8 我可以在 jre lib ext 中看到 jar 和 Java 13 之间的某个地方 它们移动了 但我无法确定它
  • 批量替换文本文件中的文本(Linux/OSX 命令行)

    我有数百个文件 需要更改其部分文本 例如 我想将 http 的每个实例替换为 rtmp 这些文件具有 txt 扩展名 并且分布在多个文件夹和子文件夹中 我基本上正在寻找一种遍历每个文件夹 子文件夹和每个文件的方法 脚本 如果它在该文件中发现
  • 终止空闲的 mysql 连接

    我看到很多连接处于打开状态并且长时间处于空闲状态 例如 5 分钟 是否有任何解决方案可以在不重新启动 mysql 服务的情况下从服务器终止 关闭它 我正在维护旧版 PHP 系统 无法关闭为执行查询而建立的连接 我是否应该将 my cnf 文
  • UIImageView 动画RepeatCount 奇怪的行为

    所以我有这段代码可以无限次地对一组图像进行动画处理 但是一旦我尝试限制它的动画处理次数 它就不起作用了 甚至没有显示图像 有效的代码 animatedMap animationImages NSArray arrayWithObjects
  • 如何为图标内的文本着色

    我想问是否有一种方法可以为我将鼠标悬停在下面链接的图标上添加颜色 例如 如果我将鼠标悬停在文本上 如何才能仅将文本的颜色设置为 红色 我认为你必须结合照片编辑器来完成它 但我真的不知道如何做 感谢帮助 这是我尝试过的代码 section a
  • Mysql - 更新表中列具有空值的第一行

    我有一个包含 API 密钥列表的数据库 我需要将电子邮件和姓名与这些关联起来 我希望我的查询更新第一行中电子邮件为空的姓名和电子邮件 id key name email 1 3046GUGYi7ab NULL NULL 2 TXQzL33H
  • 在没有工具栏的新进程中启动 Internet Explorer 7

    我需要在 IE 中运行一个 Web 应用程序 因此它至少看起来与独立应用程序类似 我还需要能够在单独的会话中同时运行此 Web 应用程序的多个实例 为了实现这种外观 我希望始终在新进程中启动 Internet Explorer 7 而无需从
  • 使用 GCC 扩展 ASM 将内联 Intel ASM 转换为 AT&T ASM

    我花了 2 天的时间来研究 AT T 内联汇编 但是在转换这个汇编时遇到了一些问题 static char vendername 50 0 asm mov eax 0 cpuid mov dword ptr vendername ebx m
  • 如何使用 List 填充 DropDownList

    我有一个下拉列表 我需要用收集到的项目填充它List
  • 使用 SBT,如何指定除当前目录之外的备用项目根目录来运行主类?

    通常 SBT 会在以下位置查找构建文件 build sbt and project Build scala 是否可以指定备用项目根目录 以便我可以构建不在当前工作目录中的项目 我本质上正在寻找相当于mvn f path to pom xml
  • 无法修改 c:\windows 目录中的 .ini 文件

    我正在编写一个 C Windows 应用程序来更新旧应用程序的 ini 文件 我没有旧应用程序的源代码 因此无法对其进行修改 旧版应用程序将设置存储在 C Windows 的 INI 文件中 该位置无法更改 为了修改 INI 设置 我一直在
  • 减少mongodb中的值

    我正在创建一个购物应用程序 每个用户都有钱包 结构如下 userName Gandalf the Grey wallet 100 orderHistory 假设该用户购买了价值 50 件的商品 有没有更好的方法而不是用 findOne 获取
  • g++ 9 概念支持包括 ubuntu 18.04 上的

    我正在使用 g std c 2a fconcepts 来处理 g 的概念 但出现 include Concepts 标头错误 没有这样的文件或目录 有人可以帮我调试这个吗 这是我从 cppreference 复制的代码 include
  • 如何在嵌入式 React 应用程序的页面之间路由?

    背景 我正在尝试在嵌入式 Shopify 应用程序中创建一些链接 我明白我不能使用简单的 a 标签 因为 Shopify 嵌入式应用程序呈现为 iframe 我在本教程中取得了一些进展 但我陷入了困境 https theunlikelyde