Fork me on GitHub

Angular6 路由跳转与传参

路由基础知识

名称 简介
Routes 路由配置,保存着哪个URL对应展示哪个组件,以及在哪个RouterOutlet中展示组件
RoutesOutlet 在html中标记路由内容呈现位置的占位符指令
Router 负责在运行时执行路由的对象,可以通过调用其navigate()和navigateUrl()方法来导航到指定的路由
RouterLink 在html中声明路由导航用的指令
ActivatedRoute 当前激活的路由对象,保存着当前路由的信息,如路由地址,路由参数等

有哪些方法可以进行路由跳转

在前端中的路由一般分为

  • 在页面通过a标签进行路由跳转,此时使用 routerLink
  • 在逻辑代码中进行跳转,此时使用navigate/navigateByUrl

下面博主通过一个新闻列表和新闻详情进行演示:

  1. 从列表页跳转到详情页,不传参
1
2
3
<!-- 列表详情页 -->
<a routerLink="/home/news/news-detail"> 跳转1</a>
<a [routerLink]="['/home/news/news-detail']"> 跳转2 </a>
  1. 从列表页跳转到详情页,传参数 —— 单一参数: id 是需要传递的参数
    1
    2
    // 在路由路径中配置参数的名称,此处带了一个叫 id 的参数变量
    {path: 'news-detail/:id', component: NewsDetailComponent}
1
2
3
4
<!-- 3种方法: 设置参数变量的 值 -->
<a routerLink="/home/news/news-detail/1"> 跳转1</a>
<a [routerLink]="['/home/news/news-detail/2']"> 跳转2 </a>
<a [routerLink]="['/home/news/news-detail',3]"> 跳转3 </a>

routerLink

  1. 接受单一参数:

(1)在 detail.ts文件中,接收参数,以下 2 种方法对上面三种方法的单个参数均可行

1
2
3
4
5
6
7
8
9
10
11
// ActivatedRoute: 当前激活的路由对象,保存着当前路由的信息,如路由地址,路由参数等
import { ActivatedRoute } from '@angular/router';
...此处省略一万字...
constructor(private route: ActivatedRoute) { }
ngOnInit() {
// 1. 使用 ActivatedRoute 的 snapshot 快照的 paramMap 的 get(key) 方法
const id = this.route.snapshot.paramMap.get('id');
// 2. 使用 ActivatedRoute 的 snapshot 快照的 params 对象
const id = this.route.snapshot.params['id'];
console.log('id==>', id);
}

(2)在 detail.ts文件中,接收参数,还有一种方法是订阅 subscribe,这种方法跟上面两种有点区别,要导入Params

1
2
3
4
5
6
7
8
9
10
import { ActivatedRoute, Params } from '@angular/router';
...此处省略一万字...
constructor(private route: ActivatedRoute) { }
ngOnInit() {
// 使用params的订阅 subscribe(不能使用 paramMap.subscribe)
this.route.params.subscribe((params: Params) => {
const id = params['id'];
console.log('id==>', id);
});
}

routerLink-detail获取参数

注意:

1
2
3
<!-- 使用该方法获取不到id的值,id的值为undefined -->
const id = this.route.snapshot.queryParams['id'];
<!-- 为什么呢?因为上面讲的参数不是使用查询参数queryParams进行设置的 -->

  1. 查询参数中,设置参数

(1)传递单一参数

1
2
3
{   // 路由路径:此处不设置参数 
path: 'news-detail', component: NewsDetailComponent,
}

1
2
3
4
<!-- 在html的a标签里直接设置查询参数 key:value,不在路由中配置 -->
<a [routerLink]="['/home/news/news-detail']" [queryParams]="{id: 4}">
444
</a>

detail 的 ts 文件中,接收参数

1
2
3
4
5
6
7
// 1. 使用 ActivatedRoute 的 snapshot 快照的 queryParams 对象
const id = this.route.snapshot.queryParams['id'];
// 2. queryParams的订阅
this.route.queryParams.subscribe((params: Params) => {
const id = params['id'];
console.log('id==>', id);
});

queryParams-单一参数

(2)传递多个参数

1
2
3
{   // 路由路径:此处不设置参数 
path: 'news-detail', component: NewsDetailComponent,
}

1
2
3
4
5
6
7
8
9
10
<!-- 在html的a标签里直接设置查询参数 key:value,此处设置多个参数 -->
<a [routerLink]="['/home/news/news-detail']"
[queryParams]="{id: 4,title:'新闻详情'}">
444 - 新闻详情
</a>
<!-- 以下不正确 -->
<!--
<a [routerLink]="['/home/news/news-detail',{queryParams:{id: 4,title:'新闻详情'}}]"> 444 - 新闻详情
</a>
<!--<a routerLink=["/detail",{queryParams:object}]></a>-->

detail 的 ts 文件中,接收参数

1
2
3
4
5
6
7
8
9
10
// 1. 使用 ActivatedRoute 的 snapshot 快照的 queryParams 对象
const id = this.route.snapshot.queryParams['id'];
const id = this.route.snapshot.queryParams['title'];
// 2. queryParams的订阅
this.route.queryParams.subscribe((params: Params) => {
const id = params['id'];
const title = params['title'];
console.log('id==>', id);
console.log('title==>', title);
});

queryParams-多个参数

  1. 路由配置中传递参数: 在路由配置中设置data,也可以进行传参

(1)传递单一参数

1
<a routerLink="/home/news/news-detail"> 跳转到详情页 </a>

1
2
3
4
5
6
// 设置参数名称和参数值
{
path: 'news-detail',
component: NewsDetailComponent,
data: {title: '我是详情页1'}
}
1
2
// 获取参数
this.title = this.routeInfo.snapshot.data['title'];

(2)传递多个参数

1
<a routerLink="/home/news/news-detail"> 跳转到详情页 </a>

1
2
3
4
5
6
7
8
{
path: 'news-detail',
component: NewsDetailComponent,
data: {
title: '我是详情页1',
subtitle: '我是详情页2'
}
}
1
2
3
// 获取参数: 一个个获取
this.title = this.routeInfo.snapshot.data['title'];
this.title = this.routeInfo.snapshot.data['subtitle'];

data-传多参

二、navigate/navigateByUrl

这里我们在list下的html文件中添加一个button,设置button的click事件,在click事件里做路由跳转

  1. navigate

(1)不传参

1
2
3
// list 文件
<!-- navigate 一定要加中括号 -->
this.router.navigate(['/home/news/news-detail']);

(2)传单个参数

1
2
// 在路由路径中配置参数的名称,此处带了一个叫 id 的参数变量
{path: 'news-detail/:id', component: NewsDetailComponent}

1
2
3
4
5
6
7
8
9
// list 文件
/* 同上面这三个相同
<a routerLink="/home/news/news-detail/1"> 跳转1</a>
<a [routerLink]="['/home/news/news-detail/2']"> 跳转2 </a>
<a [routerLink]="['/home/news/news-detail',3]"> 跳转3 </a>
*/
<!-- 设置参数的值 -->
this.router.navigate(['/home/news/news-detail/1']);
this.router.navigate(['/home/news/news-detail',1]);

注意:
==接收参数的方式,查看 routerLink —> 3. 接受单一参数,效果图也一样的==

(3)传多个参数

1
2
3
{   // 路由路径:此处不设置参数 
path: 'news-detail', component: NewsDetailComponent,
}
1
2
<!-- 这里类似于上面的 查询参数 的单个参数传递-->
this.router.navigate(['/home/news/news-detail'], { queryParams: { 'id': '2' } });

注意:
==接收参数的方式,查看 routerLink —> 5. 在查询参数中,设置参数,效果图也一样的==

1
2
3
<!-- 这里类似于上面的 查询参数 的多个参数传递-->
this.router.navigate(['/home/news/news-detail'],
{ queryParams: { 'id': '2' ,title:'详情页'} });

注意:
==同理,查看 routerLink —> 5. 在查询参数中,设置参数,效果图也一样的==

  1. navigateByUrl
1
2
3
// list 文件
<!-- navigateByUrl:上面讲的都没有这种方式 -->
this.router.navigateByUrl('/home/news/news-detail?id=' + 1);
1
2
3
4
5
6
7
8
<!-- paramMap/params是针对参数(在路由路径里配置的参数:'news-detail/:id') -->
// const id = this.route.snapshot.paramMap.get('id'); // null
// const id = this.route.snapshot.params['id']; // undefined
<!-- 接收参数:queryParams 能接收,说明传过来的是一个查询参数 -->
this.activatedRoute.queryParams.subscribe(params => {
const id = params['id'];
console.log('=== id ===>', id);
});

另外,下面navigateByUrl传单参和用法navigate一样

1
this.router.navigateByUrl('/home/news/news-detail/1');

注意:
无确凿证据,但是经过在代码中不段尝试,发现navigateByUrl不能设置多个参数,接受不到值,可能是获取值的方式不对吧,但是网上说navigateByUrl多参是可以的,获取的方式也很明显是 snapshot.queryParams 或者 queryParams.subscribe

1
2
this.router.navigateByUrl(['/home/news/news-detail'], 
{ queryParams: { 'id': '2' ,title:'详情页'} });

总结

  1. 在路由路径中配置参数”news-detail/:id”,获取方式就是params/paramMap/paramMap.subscribe
  2. 通过queryParams配置参数,获取方式就是snapshot.queryParams 或者 queryParams.subscribe
  3. 路由路径中配置的参数,浏览器地址栏上是/home/news/news-detail/1,queryParams配置的参数是/home/news/news-detail?id=1

源码地址:https://github.com/Janine-ZN/ng-basic (在routes–>news模块下)

参考网址:

  1. https://blog.csdn.net/sky_beyond/article/details/78054771
  2. https://www.kancloud.cn/jony_ii/angular/945657
坚持原创技术分享,您的支持将鼓励我继续创作!
-------------    本文结束  感谢您的阅读    -------------
0%