$route 和 $router详解和区别

在 Vue.js 中,$route$router 都是 Vue Router 提供的对象,用于管理应用的路由。尽管它们名称相似,但它们的作用和使用场景有所不同。下面是对它们的详解、区别以及示例代码。

1. $route

$route 是一个当前激活路由的对象。它包含了路由的 信息,比如当前的路径、路由参数、查询参数、路由名称等。$route 是只读的,你不能通过它来导航到另一个路由。

常见的 $route 属性
  • path: 当前路由的路径字符串。
  • params: 动态路径参数,例如 /user/:id 中的 id
  • query: 查询参数,例如 /user?id=123 中的 id
  • name: 当前路由的名称(如果有的话)。
  • hash: 当前路由的 hash 值。
  • fullPath: 完整的 URL 解析后的路径,包括 query 和 hash。
  • matched: 一个数组,包含当前路由匹配的所有路由记录(route records
<template>
  <div>
    <h2>当前路径: {{ $route.path }}</h2>
    <p>路由参数: {{ $route.params }}</p>
    <p>查询参数: {{ $route.query }}</p>
  </div>
</template>

<script>
export default {
  mounted() {
    console.log('当前路径:', this.$route.path);
    console.log('路由参数:', this.$route.params);
    console.log('查询参数:', this.$route.query);
  }
}
</script>

2. $router

$router 是整个应用的路由器实例,它包含了导航的方法和路由配置。你可以通过 $router 来编程式地导航到不同的路由,或是执行其他与路由相关的操作。

常见的 $router 方法
  • push(location): 导航到一个新的路由。location 可以是一个字符串路径或者一个描述目标路由的对象。
  • replace(location): 与 push 类似,但不会在导航历史中留下记录。
  • go(n): 在浏览器历史记录中前进或后退 n 步。
  • back(): 导航到上一个路由。
  • forward(): 导航到下一个路由。
  • beforeEach(callback): 注册一个全局前置守卫。
  • afterEach(callback): 注册一个全局后置守卫。
<template>
  <div>
    <button @click="goHome">回到首页</button>
    <button @click="goBack">后退</button>
  </div>
</template>

<script>
export default {
  methods: {
    goHome() {
      this.$router.push('/');
    },
    goBack() {
      this.$router.back();
    }
  }
}
</script>

3. 区别总结

  • 作用不同:

    • $route 用于获取当前路由的 信息,如路径、参数等,是只读的。
    • $router 用于 导航 和控制路由的行为,是一个全局路由实例。
  • 用法不同:

    • $route 常用于模板或组件中获取当前路由相关的信息。
    • $router 常用于编程式导航,例如在点击事件中跳转到另一个页面。

4. 实际场景

  • 如果你只是需要读取当前路由的信息,例如显示当前的路径或根据路由参数显示不同的内容,使用 $route
  • 如果你需要在代码中主动地改变路由,例如点击按钮跳转到另一个页面,使用 $router

希望能帮助你!

<think>好的,我现在要回答用户关于Vue.js中this.$routethis.$router区别及用法的问题。首先,我需要回顾用户提供的引用内容,并结合自己已有的知识来组织答案。 用户引用了四个来源,其中都提到了$route$router的不同角色。引用[1]指出$router是路由实例,而引用[2][3]详细说明了两者的不同用途。引用[3]特别强调了$router用于操作路由,$route用于获取路由信息,并给出了代码示例。引用[4]提到了$router.go()的用法以及$route.query的访问。 首先,我需要明确两者的基本区别$routerVue Router的实例,用于编程式的导航,比如跳转页面;而$route是当前路由的信息对象,包含路径、参数、查询等数据。需要从功能、使用场景、方法属性等方面展开。 接下来,我应该分点说明两者的区别,每个部分都要有明确的标题,比如核心定位差异、功能对比、使用场景等。然后给出具体的代码示例,帮助用户理解。此外,用户之前的提问是关于extendForm.model.id无法取值的问题,可能需要考虑在回答中是否有关联,但当前问题专注于$route$router,因此可以暂时忽略之前的上下文,但需要确保回答符合用户提供的引用内容。 需要检查是否有遗漏的重要点,例如两者的类型($router是Router实例,$route是Route对象)、常用的方法(push、replace、go等)属性(params、query、path等)。同时,需要注意用户可能混淆这两个概念,所以要通过对比表格或清晰的例子来阐明。 另外,用户可能想知道在实际开发中如何正确使用它们,所以需要提供最佳实践,比如在方法中使用$router进行导航,在计算属性中使用$route获取参数。还要注意可能遇到的常见错误,例如在获取参数时误用$router,或者在导航时误用$route。 最后,生成相关问题,帮助用户进一步学习。例如,如何获取路由参数,如何进行编程式导航,两者的底层实现原理等。确保问题覆盖用户可能感兴趣的其他方面。 现在需要将这些思路组织成结构清晰的中文回答,确保使用正确的格式,如行内公式用$...$,独立公式用$$...$$,但在这个问题中可能不需要数学公式。同时,引用用户提供的引用来源,如[^1][^2][^3][^4],在适当的位置添加引用标识。</think>### 一、核心定位差异 #### 1.1 `this.$router` 的本质 `this.$router` 是 **Vue Router 实例**,本质上是全局路由控制器,提供完整的路由操作方法,例如: ```javascript this.$router.push('/dashboard') // 导航到新路径 this.$router.replace('/login') // 替换当前历史记录 this.$router.go(-1) // 后退一步[^4] ``` **技术特性**: - 管理所有路由规则(routes配置) - 控制浏览器历史记录栈[^1] - 提供路由守卫(beforeEach等)的挂载点 --- #### 1.2 `this.$route` 的本质 `this.$route` 是 **当前激活的路由信息对象**,本质上是路由状态快照,包含: ```javascript { path: '/user/123', params: { id: '123' }, // 动态路径参数 query: { name: 'test' }, // URL查询参数 hash: '#section1', // URL哈希值 fullPath: '/user/123?name=test#section1' // 完整路径 } ``` **数据特性**: - 实时反映当前URL解析结果[^3] - 每个组件实例独享当前路由状态 - 严格只读(不可直接修改) --- ### 二、功能对比矩阵 | 维度 | `this.$router` | `this.$route` | |---------------------|------------------------------------|------------------------------------| | **类型** | `VueRouter` 实例 | `Route` 对象 | | **作用域** | 全局单例 | 当前组件路由状态 | | **主要用途** | 路由操作(导航控制)[^1] | 路由信息获取[^3] | | **典型方法** | `push()`, `replace()`, `go()` | 无(仅属性访问) | | **响应式特性** | 非响应式 | 完全响应式(参数变化自动更新) | | **修改方式** | 主动调用方法 | 通过URL变更自动更新 | --- ### 三、使用场景详解 #### 3.1 `this.$router` 的编程式导航 **场景1:带参数的跳转** ```javascript // 传递路径参数 this.$router.push({ name: 'UserProfile', params: { userId: 'u123' } // 需在路由配置中定义name }) // 传递查询参数 this.$router.push({ path: '/search', query: { keyword: 'vue' } // 生成 /search?keyword=vue }) ``` **注意**:使用`params`时必须配合`name`,使用`path`时参数会被忽略[^2] --- #### 3.2 `this.$route` 的参数获取 **场景2:获取动态参数** ```javascript // 路由配置:{ path: '/user/:id' } export default { computed: { userId() { return this.$route.params.id // 当访问 /user/1001 时返回'1001' } } } ``` **场景3:监听路由变化** ```javascript watch: { '$route'(to, from) { // 响应路径变化(如从/user/1001 跳转到 /user/1002) this.fetchUserData(to.params.id) } } ``` --- ### 四、典型错误对照 | 错误示例 | 错误分析 | 修正方案 | |-------------------------------|-------------------------------|-------------------------------| | `this.$route.push('/home')` | 混淆对象功能[^3] | 改用`this.$router.push()` | | `this.$router.params.id` | 错误访问路径参数 | 改用`this.$route.params.id` | | 直接修改`$route.query` | 违反只读原则 | 通过`$router.push()`更新 | | 未使用`watch`监听路由参数变化 | 组件不会自动响应参数更新[^2] | 添加`$route`监听器 | --- ### 五、最佳实践指南 #### 5.1 路由操作规范 ```javascript // 优先使用命名路由 this.$router.push({ name: 'Article', params: { id: 100 } }) // 替换当前历史记录(避免回退到无效页面) this.$router.replace('/error-page') ``` #### 5.2 参数安全访问 ```javascript // 使用可选链操作符防止undefined报错 const articleId = this.$route.params?.id || 'default' // 类型转换(路由参数始终是字符串) const pageNum = parseInt(this.$route.query.page) || 1 ``` #### 5.3 路由守卫联动 ```javascript // 在全局守卫中使用$router router.beforeEach((to, from, next) => { if (to.matched.some(record => record.meta.requiresAuth)) { this.$router.push('/login') // 重定向到登录页 } }) ``` --- ### 六、底层原理图解 ```mermaid graph TD A[URL变更] --> B[Vue Router] B --> C{路由匹配} C --> D[生成$route对象] D --> E[更新组件路由状态] B --> F[调用$router方法] F --> G[操作history API] G --> H[触发URL变更] ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值