代码之家  ›  专栏  ›  技术社区  ›  Jordi Nebot Roberto Zvjerković

Vue SPA在使用Vue路由器导航时强制重新加载页面

  •  0
  • Jordi Nebot Roberto Zvjerković  · 技术社区  · 6 年前

    脚本:

    我有一个Vue2 SPA可以取代一个传统的LAMP网站,但PO希望逐步部署它(仅从一个URL开始),以测试用户的反应、分析、广告收入等。

    我们构建此体系结构是为了允许这种方法:

    Architecture

    它起作用了。所以,如果你去 http://example.com/release-first

    但是,当然,当你进入 /release-first 你在水疗中心,因为大部分的导航都是用 <router-link :to=""> ,你是 被困 在SPA中,您可以访问新版本的其余部分,我们现在不希望这样做。

    可能的解决方案我想:

    <router-link> 标准标签 <a>

    所以,我试着说:

    router.beforeEach((to, from, next) => {
        if (!/\/release-first\/?$/.test(to.path)) {
            window.location.href = `http://example.com${to.path}`  
            return;
        } else {
            next();
        }
    });
    

    staging env(因为它有一个不同的子域,所以它会重定向到生产环境),但是如果我在生产环境中尝试,它就不起作用。我不知道Vue是否劫持了 Location API 或者什么,但这并没有迫使云锋提出新的请愿。

    const absolutePath = `http://example.com${to.path}`;
    window.history.pushState({ urlPath: absolutePath }, "", absolutePath);
    window.location.reload();
    

    但也不管用。。。我找不到 vue-router Docs 在导航时强制重新加载页面的选项。你知道怎么做吗?


    评论中要求的额外信息:

    • history .
    • 路径格式如下:
      • /
      • /single-level-pages
      • /two/level-pages
      • /two-levels-with/:param
      • /multiple/level/pages
      • /multiple/level/with/:param/
    • release-first 网址。我首先要发布的网址是 first-level-with/an-specific-param .
    • beforeEach 导航卫士在登台时也能很好地工作,所以唯一的问题是,当域相同时,这还不够,因为 location.href 当目标位于同一域中时,覆盖似乎不会强制新请求。
    1 回复  |  直到 6 年前
        1
  •  0
  •   Jordi Nebot Roberto Zvjerković    6 年前

    我就是这样解决的:

    router.beforeEach((to, from, next) => {
        if (
            window.location.host === "prod-env.example.com" &&
            /\/release-first/.test(from.path) &&
            !/\/release-first/.test(to.path)
        ) {
            let a = document.createElement("a");
            a.id = "forceReloadLink";
            a.href = to.path;
            document.querySelector("body").appendChild(a);
            document.getElementById("forceReloadLink").click();
        } else {
            next();
        }
    });