vue-router (两种路由模式、编程式/组件式、如何传参(优缺点)

本文详细介绍了Vue-Router的两种路由模式——hash和history,以及它们的特点。同时,文章讲解了vue-router的编程式导航和命名路由的跳转方式,并展示了如何通过params和query进行参数传递。此外,还讨论了router-link的用法及其在不同场景下的应用。

vue-router (两种路由模式、编程式/组件式、如何传参(优缺点)

veu-router的两种路由模式:hash 和 history
为什么要有 hash 和 history?

对于 Vue 这类渐进式前端开发框架,为了构建 SPA(单页面应用),需要引入前端路由系统,这也就是 Vue-Router 存在的意义。前端路由的核心,就在于 —— 改变视图的同时不会向后端发出请求。
为了达到这一个目的,浏览器提供了两种路由模式,就是hash 和 history。

1.hash —— 即地址栏 URL 中的 # 符号(此 hash 不是密码学里的散列运算)。比如这个 URL:http://www.abc.com/#/hello,hash 的值为 #/hello。它的特点在于:hash 虽然出现在 URL 中,但不会被包括在 HTTP 请求中,对后端完全没有影响,因此改变 hash 不会重新加载页面。
2.history —— 利用了 HTML5 History Interface 中新增的 pushState() 和 replaceState() 方法。(需要特定浏览器支持)
vue-router跳转方式
第一种跳转方式:编程式导航
{path: '/news', component: BYNews},
	this.$router.push({path:'news'});
	带参:
	{path: '/newDetail/:aid', component: BYNewDetail},
	this.$router.push({path:'/newDetail/495'});
第二种跳转方式:命名路由
{path: '/news', component: BYNews,name:'news'},
    this.$router.push({name:'news'});
    带参:
    this.$router.push({name:'news',params:{userId:123}});
router-linke
<router-link to="xxx" tag=" ">
//  将原本用a标签跳转的功能用router-link实现
//  to是指要跳转到的目录,tag是这个点击跳转标签的样式,可以是li的样式等等

router-link-exact-active: 路由完全匹配,当前选中
router-link-active: 路由不完全匹配
to: 表示目标路由的链接。当被点击后,内部会立刻把 to 的值传到 router.push(),所以这个值可以是一个字符串或者是描述目标位置的对象。

<!-- 字符串 -->
<router-link to="home">Home</router-link>
<!-- 渲染结果 -->
<a href="home">Home</a>

<!-- 使用 v-bind 的 JS 表达式 -->
<router-link v-bind:to="'home'">Home</router-link>

<!-- 不写 v-bind 也可以,就像绑定别的属性一样 -->
<router-link :to="'home'">Home</router-link>

<!-- 同上 -->
<router-link :to="{ path: 'home' }">Home</router-link>

<!-- 命名的路由 -->
<router-link :to="{ name: 'user', params: { userId: 123 }}">User</router-link>

<!-- 带查询参数,下面的结果为 /register?plan=private -->
<router-link :to="{ path: 'register', query: { plan: 'private' }}">Register</router-link>

vue-router路由传参

1.params传参。用this.$route.params.id打印出来即可。
2.路由属性配置传参 可以用this.$route.params.id来获取到 id的值。
3.query传参 建议解决页面刷新参数丢失问题用此方法解决。
第一种传递参数:name传参
两步完成name传参并显示在模板中;
第一在router/index.js中配置name属性,
	routes: [
	   {
	   path: '/',
	   name: 'HelloWorld',
	   component: HelloWorld
	   },
	]

第二步在src/App.vue接收{{ $route.name }}
第二种参数传递方式 通过<router-link>标签中的to传递
首先在src/App.vue中添加
<router-link :to="{name:'hello',params:{userName:'冬天'}}">hello</router-link>
然后在router/index.js中添加name

{
	path: '/hello',
	name: 'hello',
	component: hello,
	alias: '/dongtian' //别名
},

最后在hello.vue页面接收<h2>{{ $route.params.userName}}</h2>
在这里插入代码片第三种 利用rul传递参数
首先在router/index.js路由中以冒号的形式传递参数,配置路由如下
{
path: '/params/:Id(\\d+)/:title', //只能是数字
component: params
}

然后在params模块利用$route接收参数
<p>Id: {{ $route.params.Id}}</p>
<p>title: {{ $route.params.title}}</p>
最后在src/App.vue模块中的 <router-link>标签中利用rul传值
<think>好的,我现在需要回答用户关于编程式导航的问题。用户之前问过关于Vue和React中的views和components的区别,现在他们想了解编程式导航的定义和用法。根据提供的引用内容,特别是引用3和4,编程式导航在Vue中是通过调用路由实例的方法实现的,比如使用this.$router.push()。 首先,我需要明确编程式导航的基本定义,说明它和声明式导航的不同。声明式导航通常是用标签,如Vue的<router-link>,而编程式导航是通过JavaScript代码来控制导航。用户可能想知道为什么需要编程式导航,所以需要解释其使用场景,比如在表单提交后跳转或在某些条件满足时才导航。 接下来,用法部分需要分步骤说明,可能需要以Vue为例,因为引用中提到了Vue Router。需要提到如何获取路由实例,常用的方法如push、replace、go等,并给出代码示例。例如,在Vue组件中,通过this.$router.push('/path')来跳转页面。同时,也要提到React中的实现,比如使用useNavigate钩子或者history对象,但引用中没有提到React的具体实现,可能需要补充或保持专注在Vue上。 用户可能还关心参数传递,比如如何传递查询参数或动态路由参数。根据引用4中的例子,可以展示如何传递路径参数或对象形式的参数。此外,需要指出编程式导航的优点,如动态控制和条件导航,以及可能的缺点,如代码量较多。 还要注意引用中的对比部分,可能需要简要比较声明式和编程式导航,但用户的问题主要集中在编程式导航,所以重点应放在那里。需要确保回答结构清晰,步骤明确,代码示例正确,并且语言简洁易懂。最后,检查是否符合之前的回答结构,比如使用中文、正确格式的LaTeX(虽然这个问题可能不需要数学公式),以及生成相关问题。</think>### 编程式导航的定义与用法详解 #### 一、编程式导航的定义 编程式导航是通过**JavaScript代码主动控制页面跳转**的路由导航方式。与声明式导航(如 Vue 的 `<router-link>` 标签)不同,它不依赖模板语法,而是通过调用路由实例的 API 实现动态导航。这种方式的本质是**运行时逻辑控制的路由切换**[^3]。 #### 二、核心实现原理 1. **路由实例注入**:通过 `useRouter()`(Vue3)或 `this.$router`(Vue2)获取全局路由实例 2. **导航方法调用**:使用实例提供的 `push()`、`replace()` 等方法操作路由栈 3. **地址映射匹配**:根据目标路径匹配路由配置,触发组件渲染 #### 三、Vue 中的具体用法 ##### 基础跳转(无参数) ```javascript // Vue3 Composition API import { useRouter } from 'vue-router' const router = useRouter() // 跳转到首页 const goHome = () => { router.push('/home') } // Vue2 Options API methods: { goAbout() { this.$router.push('/about') } } ``` ##### 带参数跳转(两种形式) ```javascript // 路径字符串写法 router.push('/user/123?name=John') // 对象描述写法(推荐) router.push({ path: '/user/123', query: { from: 'dashboard', tracking_id: 'a1b2c3' } }) ``` ##### 路由替换(不产生历史记录) ```javascript // 替换当前路由 router.replace('/login') // 带参数替换 router.replace({ name: 'Payment', params: { orderId: 789 } }) ``` ##### 动态路由匹配 ```javascript // 路由配置 { path: '/product/:id', component: ProductDetail } // 编程式导航 router.push('/product/456') // 访问/product/456页面[^4] ``` #### 四、React 中的实现方式(补充) ```javascript // React Router v6 import { useNavigate } from 'react-router-dom' function App() { const navigate = useNavigate() // 带参数跳转 const goProfile = () => { navigate('/profile', { state: { userType: 'vip' }, // 隐式传参 replace: true // 替换当前历史记录 }) } return <button onClick={goProfile}>查看资料</button> } ``` #### 五、典型使用场景 | 场景类型 | 代码示例 | 说明 | |------------------|----------------------------------|------------------------| | 表单提交后跳转 | `onSubmit().then(() => push())` | 异步操作后的导航 | | 权限拦截 | `if(!isAuth) replace('/login')` | 未登录用户重定向 | | 分页导航 | `push({ query: { page: 2 } })` | 保持当前路由更新查询参数 | | 多步骤流程 | `push('/step2')` | 引导用户逐步完成操作 | #### 六、与声明式导航的对比 | 维度 | 编程式导航 | 声明式导航 | |-------------|-----------------------------------|-------------------------| | **实现方式** | JavaScript 函数调用 | 模板标签声明 | | **灵活性** | 支持条件判断和异步操作 | 仅支持静态配置 | | **适用场景** | 动态路由跳转、复杂交互流程 | 固定导航菜单、简单跳转 | | **代码位置** | 脚本区域(methods/computed) | 模板区域(template) | | **示例组件** | Vue: `this.$router` | Vue: `<router-link>` | | | React: `useNavigate` | React: `<Link>` | #### 七、最佳实践建议 1. **参数编码规范**: ```javascript // 推荐使用对象格式传参 router.push({ name: 'Search', query: { keyword: encodeURIComponent('vue router'), page: 1 } }) ``` 2. **异常处理**: ```javascript try { await router.push('/checkout') } catch (error) { if (error.name === 'NavigationDuplicated') { console.warn('重复导航到相同路径') } } ``` 3. **导航守卫整合**: ```javascript router.beforeEach((to, from, next) => { if (to.path === '/admin' && !isAdmin) { next('/403') // 编程式导航守卫拦截[^2] } else { next() } }) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值