vue路由:hash模式下跳转404的问题。

vue的路由模式:hash和history。

最近有个问题,其实很常见就是hash模式跳转404。

发生问题的场景:

1.项目加载的动态路由。

2.首页和登录页在一个动态路由模块,而其他的管理层页面模块在另外一个动态路由模块。按需加载(就是根据传递的关键字动态加载不同的路由模块)。

3.问题的产生:登录后跳转home首页正常,点击跳转管理层页面(新打开浏览器窗口)。这时管理层页面编写<a></a>标签:<a href="/#/home">,跳转首页为404。

分析原因:

1.没有动态加载到home的动态路由,找不到路由,因此跳转404。

2.hash模式下页面不刷新,因此不会重新加载动态路由。

解决方案:

a标签href的跳转换成@click,跳转后强制刷新当前页面。

衍生问题:在点击浏览器自带的回退上一步的按钮时候又跳转到404了。

原因:hash模式跳转后会记录上次浏览器的访问记录。因此是404。

衍生问题的解决方案:

1.在需要监听处理回退上一步的页面定义返回方法:例:goBack(){};

2.在需要处理自定义返回的页面中添加监听事件 

onBeforeMount(() => {
    if (window.history && window.history.pushState) {
        // 向历史记录中插入返回上一步的页面
        history.pushState(null, null, location.href)
        window.addEventL
Vue 3 的 hash 路由模式下,有多种路由跳转方法: ### 编程式导航 在 Vue 3 中使用 `vue-router` 时,可以通过 `useRouter` 组合式函数来获取路由实例,进而使用编程式导航方法进行路由跳转。以下是一些常见的编程式导航方法: #### `router.push` 用于导航到一个新的路由,它会向历史记录添加一个新的条目,就像用户点击了浏览器的前进按钮一样。 ```vue <template> <button @click="goToHome">Go to Home</button> </template> <script setup> import { useRouter } from 'vue-router'; const router = useRouter(); const goToHome = () => { router.push('/home'); }; </script> ``` #### `router.replace` 与 `router.push` 类似,但是它不会向历史记录添加新条目,而是替换掉当前的历史记录,就像用户点击了浏览器的“替换当前页面”操作。 ```vue <template> <button @click="replaceToHome">Replace to Home</button> </template> <script setup> import { useRouter } from 'vue-router'; const router = useRouter(); const replaceToHome = () => { router.replace('/home'); }; </script> ``` #### `router.go` 用于在历史记录中向前或向后移动指定的步数。正数表示向前移动,负数表示向后移动。 ```vue <template> <button @click="goBack">Go Back</button> <button @click="goForward">Go Forward</button> </template> <script setup> import { useRouter } from 'vue-router'; const router = useRouter(); const goBack = () => { router.go(-1); }; const goForward = () => { router.go(1); }; </script> ``` ### 声明式导航 可以使用 `<router-link>` 组件进行声明式导航,它会渲染成一个 `<a>` 标签,点击时会触发路由跳转。 ```vue <template> <router-link to="/home">Go to Home</router-link> </template> ``` ### 新窗口打开路由页面 如果需要在新窗口中打开路由页面,可以对 `window.open()` 方法进行封装,模仿 `router.push()` 的跳转风格。例如: ```javascript const openInNewWindow = (path) => { const baseUrl = window.location.origin; const fullUrl = `${baseUrl}/#${path}`; window.open(fullUrl, '_blank'); }; ``` ```vue <template> <button @click="openHomeInNewWindow">Open Home in New Window</button> </template> <script setup> const openHomeInNewWindow = () => { openInNewWindow('/home'); }; </script> ``` ### hash 路由原理 Hash 方法是在路由中带有一个 `#`,主要原理是通过监听 `#` 后的 URL 路径标识符的更改而触发的浏览器 `hashchange` 事件,然后通过获取 `location.hash` 得到当前的路径标识符,再进行一些路由跳转的操作。相关属性如下: - `location.href`:返回完整的 URL。 - `location.hash`:返回 URL 的锚部分。 - `location.pathname`:返回 URL 路径名 [^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值