关于vue路由的工作笔记(路由传参和url明明跳转但页面不刷新的原因)

本文详细探讨了Vue路由中参数传递的方式,包括如何进行路由传参以及遇到URL改变但页面未刷新的问题。通过对官方路由文档的深入学习,解析了相关机制并提供了解决方案。

官方路由文档

 
        1. 路由的参数传递问题:
            使用路由导航传递参数格式:
                this.$router.push({
                    name: '组件别名',
                    params: {参数名: 值},
                })
             接收参数分两步:
                在路由中:
                    path:使用/:参数名 进行拼接,并且多个参数可以在后面直接进行拼接
                    props: router=>({ 获取参数
                        参数名: router.params.参数名
                    })
                在组件中:
                    props:【'参数名'】,
                    data:参数名
          2. 注意,不能在同一页面下使用路由导航进行跳转页面,即使是重定向也不行。
             例: 所在页面的路由:
                    {
                       path: '/aaaaaa',
                       redirect: '/aaaaaa/bbbbb',
                       component: 'aaaaaa',
                       children:{
                            path:'/aaaaaa/bbbbb',
                            component: 'bbbbbb',
                       }
                     }
                  在此页面下进行路由导航:
                        this.$router.push('/aaaaaa')this.$router.push('/aaaaaa/bbbbbb'),
                        是不行的,这样的路由导航不会触发。
            3. 如果在父组件的页面中,进行子组件的路由导航,子组件是不会调用生命周期函数的,即,没有销毁再创建的过程。
                即使传递参数来改变路由也一样,需要通过watch来进行监听路由的变化,具体参考官方文档
              例:
                 {
                       path: '/aaaaaa',
                       redirect: '/aaaaaa/bbbbb',
                       component: 'aaaaaa',
                       children:
                       {
                            path:'/aaaaaa/bbbbb',
                            component: 'bbbbbb',
                       }{
                            path:'/aaaaaa/cccccc',
                            component: 'cccccc',
                       }
                  }
             在父组件页面下进行路由导航:
                this.$router.push('/aaaaaa/ccccccc')this.$router.push('/aaaaaa/bbbbbb'),
             需要在bbbbbb组件中调用watch函数
                watch:{
                    $route(to,from){
                    //具体操作bbbbbbb组件的内容
                    onload(); //此处的函数为异步加载 bbbbbb组件的函数,按需求使用
                    }
                }
     
<think> 我们正在解决Vue 3中使用前端路由函数进行页面跳转的问题。根据引用[1][2],Vue 3中由于没有this,因此能通过this.$router来访问路由。我们可以通过两种方式来实现编程式路由跳转:一种是直接导入路由实例,另一种是使用Vue Router提供的组合式API(useRouter)在setup函数或<script setup>中使用。 根据引用[3],我们可以在组件的setup中使用useRouter来获取路由实例,然后调用其push方法进行跳转。 然而,用户的问题是在“函数文件”中如何引入跳转路由API。根据之前的回答,我们知道在普通的函数文件中(非组件),能使用组合式API(如useRouter),因为组合式API必须在setup或<script setup>中调用。因此,在函数文件中,我们应该采用直接导入路由实例的方式。 下面,我们将详细说明在Vue 3中,如何在函数文件中使用路由跳转函数。 ### 方法1: 直接导入路由实例 这种方法适用于任何JavaScript文件,包括函数文件。 #### 步骤1: 创建路由实例并导出 在路由配置文件(通常是`src/router/index.js`)中,我们创建路由实例并导出它。 ```javascript // src/router/index.js import { createRouter, createWebHistory } from &#39;vue-router&#39;; import Home from &#39;../views/Home.vue&#39;; const routes = [ { path: &#39;/&#39;, name: &#39;Home&#39;, component: Home }, { path: &#39;/about&#39;, name: &#39;About&#39;, component: () => import(&#39;../views/About.vue&#39;) } ]; const router = createRouter({ history: createWebHistory(process.env.BASE_URL), routes }); export default router; // 导出路由实例 ``` #### 步骤2: 在函数文件中导入路由实例并使用 然后,在任意的函数文件中,我们可以导入这个路由实例,并调用其方法(如push、replace等)进行跳转。 ```javascript // src/utils/navigation.js import router from &#39;@/router&#39;; // 导入路由实例 // 跳转到指定路径 export function navigateTo(path) { router.push(path); } // 跳转到命名路由,并可传递参数 export function navigateToUserProfile(userId) { router.push({ name: &#39;UserProfile&#39;, // 确保路由配置中有名为&#39;UserProfile&#39;的路由 params: { id: userId } }); } // 带查询参数跳转 export function navigateWithQuery() { router.push({ path: &#39;/search&#39;, query: { keyword: &#39;vue&#39; } }); } ``` #### 步骤3: 在组件中使用这些函数 在Vue组件中,我们可以导入这些函数并绑定到事件上。 ```vue <template> <button @click="goToAbout">跳转到关于页面</button> <button @click="goToUser(123)">跳转到用户123的详情页</button> </template> <script setup> import { navigateTo, navigateToUserProfile } from &#39;@/utils/navigation&#39;; function goToAbout() { navigateTo(&#39;/about&#39;); } function goToUser(userId) { navigateToUserProfile(userId); } </script> ``` ### 方法2: 使用组合式API(仅适用于组件内) 在Vue组件的setup函数或`<script setup>`中,我们可以使用组合式API的`useRouter`来实现跳转。但请注意,这种方法能在普通的函数文件中使用,因为`useRouter`必须在setup的上下文中调用。 ```vue <script setup> import { useRouter } from &#39;vue-router&#39;; const router = useRouter(); function goToAbout() { router.push(&#39;/about&#39;); } function goToUser(userId) { router.push({ name: &#39;UserProfile&#39;, params: { id: userId } }); } </script> ``` ### 总结 1. **在函数文件中**:应该使用直接导入路由实例的方式(方法1),因为函数文件没有Vue的上下文,无法使用组合式API。 2. **在组件内部**:两种方式都可以,但组合式API(方法2)更符合Vue 3的响应式风格。 ### 注意事项 - 使用命名路由跳转时,需要确保路由配置中已经定义了该名称(name属性)[^1][^3]。 - 传递参数时,`params`只能`name`一起使用,`path`一起使用。而`query`则可以使用`path`或`name`[^2]。 - 在函数文件中使用路由实例时,要确保路由实例已经创建完成,并且导入路径正确。 通过以上方法,你就可以在Vue 3的函数文件中实现页面跳转了。 §§相关问题§§ 1. Vue 3中如何在非组件文件中访问Vue Router? 2. Vue Router 4的编程式导航有哪些常用方法? 3. 如何在Vue 3中传递路由参数暴露在URL上? 4. 如何在Vue 3中获取当前路由的信息(如参数)? 5. Vue 3路由跳转时如何添加导航守卫? [^1]: vue3页面跳转vue3页面跳转有两种方式,第一种是标签内跳转,第二种是编程式路由导航 [^2]: Vue前端开发-路由跳转及带参数跳转。在Vue 3中,由于没有实例化对象this,因此,无法通过this去访问 $route对象,而是通过导入一个名为 useRouter 的方法 [^3]: Vue3.0使用JavaScript脚本实现Vue Router路由页面跳转、获取URL参数 [^4]: Vue3 + Vue Router 学习笔记:实现登录与页面跳转 [^5]: Vue3入门笔记----实现页面路由功能 </think>在 Vue 3 中使用前端路由函数进行页面跳转,主要有以下两种常用方法: ### 方法一:导入路由实例(推荐用于函数文件) 在普通 JS/TS 文件中直接导入创建好的路由实例: ```javascript // utils/navigation.js import router from &#39;@/router&#39; // 导入路由实例 // 路径跳转 export function navigateTo(path) { router.push(path) // 跳转到指定路径 } // 命名路由跳转(推荐) export function goToUserProfile(userId) { router.push({ name: &#39;UserProfile&#39;, // 路由配置中的name params: { id: userId } // 参数 }) } // 带查询参数跳转 export function searchProducts(keyword) { router.push({ path: &#39;/search&#39;, query: { q: keyword } // URL显示为/search?q=keyword }) } // 替换当前路由(无历史记录) export function redirectToLogin() { router.replace(&#39;/login&#39;) } ``` ### 方法二:使用 `useRouter`(仅适用于组件) 在 Vue 组件中使用组合式 API: ```vue <script setup> import { useRouter } from &#39;vue-router&#39; const router = useRouter() // 路径跳转 function goHome() { router.push(&#39;/&#39;) } // 命名路由参数 function showUser(userId) { router.push({ name: &#39;UserProfile&#39;, params: { id: userId } // 匹配路由 /user/:id }) } // 带查询参数 function search(keyword) { router.push({ path: &#39;/search&#39;, query: { keyword } // URL显示为/search?keyword=value }) } </script> ``` ### 路由配置示例 ```javascript // router/index.js import { createRouter, createWebHistory } from &#39;vue-router&#39; const routes = [ { path: &#39;/&#39;, name: &#39;Home&#39;, component: () => import(&#39;@/views/Home.vue&#39;) }, { path: &#39;/user/:id&#39;, name: &#39;UserProfile&#39;, // 命名路由 component: () => import(&#39;@/views/UserProfile.vue&#39;) }, { path: &#39;/search&#39;, name: &#39;Search&#39;, component: () => import(&#39;@/views/Search.vue&#39;) } ] const router = createRouter({ history: createWebHistory(), routes }) export default router ``` ### 使用技巧 1. **参数类型**: - `params`:动态路径参数(如 `/user/:id`) - `query`:URL 查询参数(如 `?keyword=vue`) 2. **命名路由 vs 路径**: ```javascript // 推荐:使用命名路由(避免硬编码路径) router.push({ name: &#39;UserProfile&#39;, params: { id: 123 } }) // 推荐:硬编码路径 router.push(&#39;/user/123&#39;) ``` 3. **隐藏敏感参数**: ```javascript // 使用params传递敏感数据(不会显示在URL中) router.push({ name: &#39;Checkout&#39;, params: { token: &#39;secret_token&#39; } // 安全传递 }) ``` 4. **导航守卫**: ```javascript // 全局前置守卫 router.beforeEach((to, from, next) => { if (to.name === &#39;AdminPanel&#39; && !isAuthenticated()) { next(&#39;/login&#39;) // 重定向到登录页 } else { next() } }) ``` ### 最佳实践建议 1. 将路由跳转逻辑封装在 `@/utils/navigation.js` 文件中 2. 优先使用命名路由代替硬编码路径 3. 敏感参数使用 `params` 传递(URL 中暴露) 4. 在组件中使用 `useRouter()`,函数文件中直接导入路由实例 > 注意:`useRouter()` 只能在组件的 `setup()` 或 `<script setup>` 中使用,普通 JS 文件需使用导入路由实例的方式[^2][^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值