在 iframe/对象标签内运行时更新初始路由器 url

2024-05-09

我目前正在容器/主 Vue 应用程序的对象标签(iframe 也可以工作)内渲染 Vue 应用程序。首先,我设置一个文件服务器,为该容器或请求的子应用程序提供服务,以在 div 内呈现。

为了简单起见,我将仅显示 Node/Express 服务器所需的路由

// serve the sub-app on demand
router.get('/subApps/:appName', function(req, res) {
    res.sendFile(path.resolve(__dirname, `../apps/${req.params.appName}/index.html`);
});

// always render the app container if no sub-app was requested
router.get('*', function(req, res) {
    res.sendFile(path.resolve(__dirname, '../base/index.html'));
});

我的应用程序容器/主 Vue 应用程序位于渲染的视图文件内/apps/:appName,请求该子应用程序并将其包装到对象标签中

  document.getElementById("customAppContainer").innerHTML = `<object style="width: 100%; height:100%;" data="http://localhost:3000/subApps/${appKey}"></object>`;

这种方法工作正常,但渲染的子应用程序使用启动 urlhttp://localhost:3000/subApps/app-one虽然它应该使用 urlhttp://localhost:3000/apps/app-one。当子应用程序加载路由器实例时,我必须将启动 url 从 iframe url 更改为浏览器 url(父级)。

我想解决这个问题history.replaceState

const router = new Router({ ... });

router.afterEach((to, from) => {
    localStorage.subAppRouteUpdate = to.path;
});

if (window.location !== window.parent.location) {
    const browserUrl = top.location.href;
    history.replaceState(null, null, browserUrl);
}

export default router;

我为什么要这样做?这App.vue主应用程序的应将子应用程序路由附加到浏览器 URL。通过这种方法,可以在子应用程序内部导航时更新浏览器 URL。我通过将子应用程序 URL 存储到本地存储并侦听主应用程序端的本地存储更改来实现此目的。所以App.vue文件使用此代码

<script>
export default {
  created() {
    window.addEventListener("storage", () => {
      const fullRoute = this.$router.currentRoute.fullPath;
      const routeSegments = fullRoute.split("/");
      const appsIndex = routeSegments.indexOf("apps");
      const newBaseUrlSegments = routeSegments.slice(0, appsIndex + 2);
      const newBaseUrl = newBaseUrlSegments.join("/");
      const subAppRoute = localStorage.subAppRouteUpdate;
      const updatedUrl = newBaseUrl.concat(subAppRoute);
      history.replaceState(null, null, updatedUrl);
    });
  }
};
</script>

使用 IFrame 时启用路由。它几乎可以工作,这就是我得到的

不幸的是,当打电话时/浏览器 URL 更新为子应用程序的

http://localhost:3000/apps/app-one/apps/app-one http://localhost:3000/apps/app-one/apps/app-one

虽然我在期待

http://localhost:3000/apps/app-one/ http://localhost:3000/apps/app-one/


再生产:

我创建了一个存储库 https://github.com/byteCrunsher/reproduction用于复制/测试。有人知道可能出了什么问题或如何修复该网址更新吗?


Update:

我认为发生错误是因为路由器.js我正在触发此代码的子应用程序

if (window.location !== window.parent.location) {
    const browserUrl = top.location.href;
    history.replaceState(null, null, browserUrl);
}

router.afterEach((to, from) => {
    console.log({ urlToAppend: to.path });
    localStorage.subAppRouteUpdate = to.path;
});

ReplaceState 函数将更新 IFrame url/subApps/app-one到正确的浏览器网址/apps/app-one。不幸的是,这将触发 afterEach 事件并且to.path结果是/apps/app-one虽然应该是/.

如果网址是/apps/app-one/users/create每个事件之后应该触发/users/create当然。

但我不知道如何修复这个第一个触发的事件。


这可能是一个有点hacky的解决方案,但它对我有用。只需检查当前 url 路径不等于to.path如果事件被触发两次

router.afterEach((to, from) => {
    console.log({ urlToAppend: to.path });
    if (router.currentRoute.path !== to.path) {
        localStorage.subAppRouteUpdate = to.path;
    }
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 iframe/对象标签内运行时更新初始路由器 url 的相关文章

随机推荐

  • iOS 绘制圆圈

    我正在尝试在我的 iOS 应用程序中创建下面的圆圈 我知道如何制作圆圈 但不完全确定如何沿着弧线获取点 它必须是代码而不是图像 下面也是我目前拥有的代码 void drawRect CGRect rect CGPoint point poi
  • VBA:删除数组项后减少循环迭代?

    在 Excel 的 VBA 中 For i 0 To UBound artMaster For j i To UBound artMaster If i lt gt j And artMaster i VDN artMaster j VDN
  • Silverlight xaml TextBlock.Text 与 CDATA 在运行时未显示?

    以下 xaml 会生成文本 激活左侧测试 在运行时和设计时可见 在 Vs2010 中
  • 在主屏幕上创建文件夹,我可以在其中放置一些图标在网格中

    在Android中我想做主屏幕上的文件夹以编程方式喜欢清理大师为游戏助推器所做的事情谷歌也将其所有应用程序放在一个文件夹中 我尝试使用 Live 文件夹 但它已被弃用 并且在最新的 Android 版本中也不适用于我 它是一个小部件还是我无
  • Intellij IDEA:按实际顺序查看类方法

    我将从 Eclipse 切换到 IntelliJ IDEA 目前我使用的是 IDEA v 12 0 4 In Eclipse when you called Class Outline view Ctrl O you saw methods
  • 如何在配置/初始化程序中使用 YML 值

    我正在努力将 Facebook 集成到我的应用程序中 为此 我使用 koala devise 和omniauth 对于考拉 我有 config facebook yml development app id 123123132123 sec
  • 如何向 MySQL 中的 ENUM 类型列添加更多成员?

    MySQL 参考手册没有提供关于如何执行此操作的明确示例 我有一个 ENUM 类型的国家 地区名称列 我需要向其中添加更多国家 地区 实现此目的的正确 MySQL 语法是什么 这是我的尝试 ALTER TABLE carmake CHANG
  • 无法使用 File delete() 方法删除 git repo 中的 .pack 文件

    对于我正在编写的这个方法 我使用 jgit 库克隆一个 git 存储库 然后对这些文件执行一些操作 最后我想删除该存储库 我遇到的问题是 当我在 pack 文件 位于 git objects pack 中 上调用 delete 方法时 它无
  • php postgresql pdo 从标准输入复制

    COPY table name field1 field2 field3 FROM STDIN CSV 1 2 q w 3 4 a s 5 6 d 如何通过 PDO 执行此查询 Update 问题是 PDO 驱动程序将此查询作为语句执行 例
  • java.lang.AbstractMethodError: javax.xml.parsers.DocumentBuilderFactory.setFeature(Ljava/lang/String;Z)V

    我有一个应用程序 可以使用它创建 Excel 文件apache POI 3 17我收到此错误消息apache POI当我运行应用程序时记录Tomcat 这是什么意思 我该如何解决 我最终将其添加到 eclipse ini 文件中 Djava
  • 是否有可能在 C++ 中获取 std::array 的子数组?

    我想做类似的事情 std array
  • 删除整个表格行

    有没有办法删除整个表格行 穿过整个单元格 而不仅仅是文本 我尝试过申请 text decoration line through 在列和行级别 但这只会删除文本 而不是整个单元格 有没有办法打整排 如果所有行的高度相同 最简单的方法可能是应
  • 将所有脚本参数复制到另一个变量

    我需要复制所有脚本参数并将它们传递给另一个脚本 我尝试这样做 args printargs sh args echo printargs sh args 但在这种情况下 如果我使用包含空格的参数调用我的父脚本 例如 script sh ar
  • Visual Studio Code 中的剪切行快捷方式(VS 中的 Ctrl+L)(不是删除行!)

    Visual Studio 默认情况下有快捷键 Ctrl l 剪切线 它将光标所在的行复制到剪贴板并将其删除 我在 Visual Studio Code 中找不到它 有没有办法将其添加为最终用户 我知道有Ctrl Shift K用于删除行
  • 为什么 'self.self' 在 swift 中编译并运行?

    昨天我回顾了 Swift 中的一段代码 其中包括这一行 self self someProperty 这让我很惊讶 因为这个词self被保留并用作对当前实例的引用 起初我用其他语言检查了这种现象 但都给出了错误 这并不奇怪 但是 为什么它能
  • Alexa 找不到我的技能

    我根据 Alexa Skills Kit 中提供的示例之一将 Alexa Skill 创建为 AWS Lambda Node js 应用程序 我遵循了所有说明 我的 Echo 注册的账户与我在 AWS 上的开发者账户相同 我在亚马逊开发者控
  • IE - 阻止 Iframe 中的兼容模式

    是否可以从 Iframe 中禁用 IE 兼容模式 如果我在iframehtml 这不起作用 这取决于您是否有权访问主机 父级 的 x ua 兼容元 当主机页面处于 IE9 模式或更高版本时 其状态强加于 iframe 这里有一个很好的解释
  • Python 解释器 Shell 可以与 Vi(m) 集成吗?

    我喜欢使用 bpython 但在 Ruby 中 有一个名为 Interactive editor 的 gem 它可以将 Vi m 与 Ruby shell 结合起来 从而使开发过程更加舒适 Interactive editor 的一个很好的
  • 自动移动站点重定向

    我刚刚制作了我的第一个 jQuery 移动网站 我想让使用手机查看我的 完整网站 的人自动转移到 移动网站 如果需要 还可以单击链接查看完整站点 我不知道从哪里开始 有一些我可以使用的 JavaScript 吗 如果您想查看这些网站的外观
  • 在 iframe/对象标签内运行时更新初始路由器 url

    我目前正在容器 主 Vue 应用程序的对象标签 iframe 也可以工作 内渲染 Vue 应用程序 首先 我设置一个文件服务器 为该容器或请求的子应用程序提供服务 以在 div 内呈现 为了简单起见 我将仅显示 Node Express 服