【问题标题】:Reloading same page in a Vue SPA site在 Vue SPA 站点中重新加载同一页面
【发布时间】:2020-04-19 07:25:01
【问题描述】:

我已经尝试了十几种方法来做到这一点。 .htaccess 在 apache 托管(我的网站托管的首选环境)中,通过 heroku,通过带有 _redirects 文件和 netlify.toml 文件的 netlify。而且它们似乎都不起作用。 Vue 建议像这样编写.htaccess 文件:

<IfModule mod_rewrite.c>
   RewriteEngine On
   RewriteBase /
   RewriteRule ^index\.html$ - [L]
   RewriteCond %{REQUEST_FILENAME} !-f
   RewriteCond %{REQUEST_FILENAME} !-d
   RewriteRule . /index.html [L]
</IfModule>

但它不会重新加载到同一页面。它重新加载到 index.html 主页面。现在,我明白为什么要这样做了。本质上,SPA 中的每个页面都是一个 index.html。正是这些组件使它看起来像一个不同的页面。但是,这适用于我见过的每个 SPA 网站。所以当我重新加载时,必须有一种方法让渲染保持一致。

如果有关系,这里有一些相关代码

环境

  • VueJS 2
  • 类星体 1.0
  • Firebase
  • Vuew 路由器(在 VueJS 中开箱即用)

QUASAR.CONF.JS

  build: { vueRouterMode: "history" }

ROUTES.JS(最小)

import Layout from "layouts/Layout.vue";
import Home from "pages/Index.vue";
import About from "pages/About.vue";
import Contact from "pages/Contact.vue";


const routes = [
  {
    path: "/",
    component: Layout,
    children: [
      { path: "/", component: Home },
      { path: "/about", component: About },
      { path: "/contact", component: Contact }
    ]
  }
];

// Always leave this as last one
if (process.env.MODE !== "ssr") {
  routes.push({
    path: "*",
    component: () => import("pages/Error404.vue")
  });
}

export default routes;

如果你有什么需要看的,请告诉我。

问题 该页面加载正常,但是当我重新加载页面时,它会加载主页(HOME),即索引页面。如果没有 htaccess 代码,它会显示找不到页面(甚至不是我自己的 404)。历史模式会从 URL 中删除 # 并将其置于哈希模式也无法修复它。

任何帮助将不胜感激

【问题讨论】:

  • 您的意思是即使 Vue 应用程序在例如 www.yoursite.com/#/about 的路线上,页面刷新也会将您带到您的“索引”页面而不是“关于”页面?假设你当然有一个关于页面
  • @CoderLee 正确。
  • 您是否尝试过删除 .htaccess 和其他规则?您应该只需要 apache2 或您使用的任何服务器来提供索引 HTML 并让 JS 处理其余部分。听起来有些东西正在强制您的 URL 回到索引或覆盖您当前的路由。
  • 删除 htaccess 会破坏它。它显示 404 而不是重新路由(甚至主页)。我也在问题中解释了这一点。此外,当我设置 htaccess 规则时,它会进入整个站点的主根目录。不只是一页。我正在使用 Dreamhost 托管
  • 您是否尝试过在您的 Vue 应用程序中删除 404 的全部捕获?也许 path:'*' 正在捕获每条路线。听起来好像有什么在做。

标签: javascript .htaccess vue.js vuejs2 vue-router


【解决方案1】:

通过在路由文件(我的设置中的 src/routes/index.js)中设置模式和路由器,我能够毫无问题地将我的应用从哈希转换为历史记录:

import Vue from 'vue';
import VueRouter from 'vue-router';
import Home from '../views/Home.vue';
import NotFound from '../components/NotFound.vue';

Vue.use(VueRouter);

const routes = [
  {
    path: '/',
    name: 'home',
    component: Home,
  },
  {
    path: '*',
    component: NotFound,
  },
];

const router = new VueRouter({
  mode: 'history',
  routes,
});

export default router;

通过设置模式和导出路由器,我能够从我的应用程序中解决 404 问题。然而,Quasar 可能正在做其他事情。希望这种方法适合您。

【讨论】:

  • 历史模式已经在 quasar.conf 中实现。我可以通过看到 hashbang 消失来验证这一点。我也在我的问题中解释了这一点。我在 index.js 中定义路由器,它导入您在我的问题中看到的 route.js。所以基本上它和我的东西是一样的,只是我把它分成了 2 个不同的文件
  • 您拥有 Quasar 和 Vue 推荐的一切。对于为什么它不起作用,这是一个令人头疼的问题。如果可以的话,可以尝试在 Vue 而不是 Quasar 中设置历史模式。这是在黑暗中拍摄,但推荐的设置无论如何都不起作用。
  • 是的,也试过了,哈哈……我告诉你。我已经尝试了所有可以想象的
  • 我相信哈哈,这至少可以说是令人讨厌的。如果你弄明白了,请分享,因为你的 Quasar 或 Vue 肯定有什么疯狂的东西。
猜你喜欢
  • 2020-07-12
  • 1970-01-01
  • 2020-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多