angular router https://angular.io/guide/router

本文转自:https://blog.csdn.net/kuangshp128/article/details/72626066

一、学单词:angular路由中涉及到很多新单词词汇
单词 说明 使用场景
Routes 配置路由,保存URL对应的组件,以及在哪个RouterOutlet中展现
RouterOutlet 在html中标记挂载路由的占位容器
Router 在ts文件中负责跳转路由操作 Router.navigate([“/xxx”]),Router.navigateByUrl(“/xxx”)
routerLink 在html中使用页面跳转 <a [routerLink]="['/xx']"
routerLinkActive 表示当前激活路由的样式 routerLinkActive=”active”
ActivedRoute 获取当前激活路由的参数, 这个是一个类,要实例化,使用实例化后的对象.params,xx.queryParams
redirectTo 重定向 redirectTo=”/路径”
useHash 使用哈希值展现 {useHash:true}
pathMatch 完全匹配 pathMatch:”full”
二、实现一个简单的路由
1、使用angular-cli创建一个带路由的项目
2、手动配置路由文件

2.1使用nagular-cli创建一个带路由的项目

ng new 项目名称 --routing
会多创建一个app-routing.module.ts文件代码如下

import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';

const routes: Routes = [
{
path: '',
children: []
}
];

@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule],
providers: []
})
export class AppRoutingModule { }

2.2手动配置路由文件

在app文件夹下面创建一个app.router.ts文件,基本结构代码如下:

/**
* 定义路由跳转页面
*/
//引入路由文件
import {Routes, RouterModule} from "@angular/router";
import {ModuleWithProviders} from "@angular/core";
//引入挂载到路由上的组件
....
//配置一个路由数组
const rootRouterConfig : Routes = [
{path:"路径",component:组件名称},
{path:"page4",component:组件名称,
children:[
{path:"路径",component:...},
{path:"路径",component:...}
]
}
]

//对外暴漏出去
export const rootRouterModule : ModuleWithProviders = RouterModule.forRoot(rootRouterConfig,{useHash:true});

在根模块中

//引入自己定义的路由
import {rootRouterModule} from "./app.router";
@NgModule({
....
imports: [
BrowserModule,
FormsModule,
HttpModule,
rootRouterModule
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }

三、一个简单的路由案例代码,使用了redirectTo做重定向
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import {Page1Component} from "app/page1/page1.component";
import {Page2Component} from "app/page2/page2.component";

const routes : Routes = [
{path: '',redirectTo:"/page1",pathMatch:"full"},
{path: 'page1',component:Page1Component},
{path: 'page2',component:Page2Component},
];

@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule],
providers: []
})
export class AppRoutingModule { }

<div class="container" style="margin-top:50px;">
<div class="row">
<div class="col-md-2">
<ul class="list-group">
<li class="list-group-item"><a [routerLink]="['/page1']">列表一</a></li>
<li class="list-group-item"><a [routerLink]="['/page2']">列表二</a></li>
</ul>
</div>
<div class="col-md-10" style="border:1px solid #ddd;padding-bottom:50px;padding-top:50px;">
<router-outlet></router-outlet>
</div>
</div>
</div>

四、添加404页面
如果用户输入的url地址不正确,或者输入的地址不存在跳转到指定的路径,使用”**”去匹配,路由会先从上面匹配,如果匹配不成功就会往下匹配

const routes : Routes = [
{path: '',redirectTo:"/page1",pathMatch:"full"},
{path: 'page1',component:Page1Component},
{path: 'page2',component:Page2Component},
{path: '**',component:Page404Component},
];

五、在TS文件中通过事件绑定跳转页面实现切换路由
在ts文件中实现路由的跳转有两种方式:本人建议用第一种,跟html页面中保持一致
1
1、navigate里面穿的一个数组
2、navigateByUrl里面传递一个字符串
import { Component, OnInit } from '@angular/core';
import {Router} from "@angular/router";

@Component({
selector: 'app-page404',
templateUrl: './page404.component.html',
styleUrls: ['./page404.component.css']
})
export class Page404Component implements OnInit {

constructor(private router:Router) { }

ngOnInit() {
}
topage1(){
this.router.navigate(["/page1"]);
}
topage2(){
this.router.navigateByUrl("/page2");
}
}

六、实现选择当前路由高亮显示
1、在html页面中添加routerLinkActive=”样式名称”

<ul class="list-group">
<li class="list-group-item"><a [routerLink]="['/page1']" routerLinkActive="active">列表一</a></li>
<li class="list-group-item"><a [routerLink]="['/page2']" routerLinkActive="active">列表二</a></li>
</ul>

2、在样式表中定义active样式
七、路由实现两个组件之间切换传递参数,主要有两种方式
1、path方法传递参数
2、query方法传递参数

7.1 通过path方式传递参数
1、配置传递path参数路由
{path: 'page2/:id1/:id2',component:Page2Component},
1
2、修改html代码
<li class="list-group-item"><a [routerLink]="['/page2',1,2]" routerLinkActive="active">列表二</a></li>
1
3、修改Page2Component的ts文件

import {Component, OnInit, OnDestroy} from '@angular/core';
import {ActivatedRoute} from "@angular/router";
export class Page2Component implements OnInit,OnDestroy {
private id1 : number;
private id2 : number;
private sub:any;
constructor(private _activatedRoute:ActivatedRoute) { }

ngOnInit() {
this.sub = this._activatedRoute.params.subscribe(params=>{
console.log(`parames参数:${params}`)
this.id1 = params["id1"];
this.id2 = params["id2"];
console.log(`获取的参数id1:${this.id1},id2:${this.id2}`)
})
}
//组件卸载的时候取消订阅
ngOnDestroy() : void {
this.sub.unsubscribe();
}
}

7.2 通过navigate传递path参数
this.router.navigate(["/page1",参数1,参数2]);
//或者是这样
this.router.navigateByUrl("/page2/参数1/参数2");

7.3通过query传递参数
1、修改html页面添加传递参数

<li class="list-group-item"><a [routerLink]="['/page1']" [queryParams]="{id:1,name:'hello',age:20}" routerLinkActive="active">列表一</a></li>
1
2、修改ts代码使用queryParams获取传递参数

import {Component, OnInit, OnDestroy} from '@angular/core';
import {ActivatedRoute} from "@angular/router";

@Component({
selector: 'app-page1',
templateUrl: './page1.component.html',
styleUrls: ['./page1.component.css']
})
export class Page1Component implements OnInit,OnDestroy {
private sub:any;
private id:number;
private name:string;
private age:number;
constructor(private _activatedRoute:ActivatedRoute) { }

ngOnInit() {
this.sub = this._activatedRoute.queryParams.subscribe(queryParams=>{
console.log("queryParams参数:",queryParams);
this.id = Number.parseInt(queryParams["id"]);
this.name = queryParams["name"];
this.age = Number.parseInt(queryParams["age"]);
})
}
ngOnDestroy(){
this.sub.unsubscribe();
}
}

3、通过navigate传递query参数

this.router.navigate(["/page1"],{queryParams:{"id":"10","name":"word","age":"30"}});
1
4、通过navigateByUrl传递query参数
javascript
this.router.navigateByUrl("/page1?name=hello&id=2&age=20");
八、配置子路由
1、修改路由文件

const routes : Routes = [
{path: '',redirectTo:"/page1",pathMatch:"full"},
{path: 'page1',component:Page1Component},
{path: 'page2/:id1/:id2',component:Page2Component},
{path: 'page3',component:Page3Component,children:[
{path:"",redirectTo:"page31",pathMatch:"full"},
{path:"page31",component:Page31Component},
{path:"page32",component:Page32Component},
]},
{path: '**',component:Page404Component},
];

2、在page3的html页面修改

<button class="btn btn-danger" [routerLink]="['./page31']">page31</button>
<button class="btn btn-danger" [routerLink]="['./page32']">page32</button>
<router-outlet></router-outlet>

九、辅助路由(兄弟路由)就是一个页面中使用多个路由插座<router-outlet></<router-outlet>
使用方式:

1、在<router-outlet name="xxx"></<router-outlet>定义别名
2、在路由文件中增加一个outlet的属性,如:{path: 'page1',component:Page1Component,outlet="xxx"}
十、demo案例地址
---------------------
作者:水痕01
来源:CSDN
原文:https://blog.csdn.net/kuangshp128/article/details/72626066
版权声明:本文为博主原创文章,转载请附上博文链接!

[转]Angular开发(十八)-路由的基本认识的更多相关文章

  1. python运维开发(十八)----Django(二)

    内容目录 路由系统 模版 Ajax model数据库操作,ORM 路由系统 django中的路由系统和其他语言的框架有所不同,在django中每一个请求的url都要有一条路由映射,这样才能将请求交给对 ...

  2. unity3D游戏开发十八之NGUI动画

    我们先来看下帧动画,顾名思义,就是一帧帧的图片组成的动画,我们须要用到UISprite Animation组件,它的属性例如以下: Framerate:播放速率,也就是每秒钟播放的帧数 Name Pr ...

  3. SpringBoot开发十八-显示评论

    需求介绍 显示评论,还是我们之前做的流程. 数据层:根据实体查询一页的评论数据,以及根据实体查询评论的数量 业务层:处理查询评论的业务,处理查询评论数量的业务 表现层:同时显示帖子详情数据时显示该帖子 ...

  4. Senparc.Weixin.MP SDK 微信公众平台开发教程(十八):Web代理功能

    在Senparc.Weixin.dll v4.5.7版本开始,我们提供了Web代理功能,以方便在受限制的局域网内的应用可以顺利调用接口. 有关的修改都在Senparc.Weixin/Utilities ...

  5. Web 前端开发人员和设计师必读文章推荐【系列二十八】

    <Web 前端开发精华文章推荐>2014年第7期(总第28期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...

  6. Web 前端开发精华文章集锦(jQuery、HTML5、CSS3)【系列十八】

    <Web 前端开发精华文章推荐>2013年第六期(总第十八期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各种增强网站用户体验的 jQuery 插件,展示前沿的 HTML5 和 C ...

  7. Android进阶(十八)AndroidAPP开发问题汇总(二)

    Android进阶(十八)AndroidAPP开发问题汇总(二) 端口被占用解决措施: Android使用SimpleAdapter更新ListView里面的Drawable元素: http://ww ...

  8. iOS 11开发教程(十八)iOS11应用视图之使用代码添加按钮

    iOS 11开发教程(十八)iOS11应用视图之使用代码添加按钮 由于使用编辑界面添加视图的方式比较简单,所以不在介绍.这里,直接讲解代码中如何添加.使用代码为主视图添加一个按钮的方式和在1.3.3节 ...

  9. 使用 C# 开发智能手机软件:推箱子(十八)

    这是"使用 C# 开发智能手机软件:推箱子" 系列文章的第十八篇.在这篇文章中.介绍 Window/SelectLevelDlg.cs 源程序文件. 这个源程序文件包括 Selec ...

随机推荐

  1. 只要一行代码求一串字符中某字符(串)出现次数,c#

    这里只要一行代码就行. static void Main(string[] args) { string str = "qwerwqr;sfdsfds;fdfdsf;dfsdfsdf;dsf ...

  2. 《高质量C++&C 编程指南》学习笔记

    这本电子书是在国科大上课时候,老师在课件资源里边提供的.之所以会重视这个文件,是因为本科时候,有个老师提到过:那个学生遍的代码很整齐,看起来让人舒服,我就知道工大留不下他.因此,我就格外注意这件事,但 ...

  3. 剑指C++面试

    传闻公司老总欠下巨款,带着小姨子跑路了~  树倒猢狲散,接下来要好好准备面试,以期找到一份满意的工作. 面试准备分下面几个方面进行,形成面试系列文章,文章内容以问答的方式呈现. 1.C++语言基础 传 ...

  4. 使用node自动生成html并调用cmd命令提交代码到仓库

    生成html提交到git仓库 基于目前的express博客,写了一点代码,通过request模块来请求站点,将html保存到coding-pages目录,复制静态文件夹到coding-pages,最后 ...

  5. 【洛谷3865】 【模板】ST表(猫树)

    传送门 洛谷 Solution 实测跑的比ST表快!!! 这个东西也是\(O(1)\)的,不会可以看我上一篇Blog 代码实现 代码戳这里

  6. 微信小程序的概要

    微信小程序的概要 学习小程序要了解一下什么事小程序,小程序开发前需要做哪些准备,微信小程序开发工具的使用,小程序中的目录结构解析,视图和渲染,事件. 小程序的配置详解,小程序的生命周期与app对象的使 ...

  7. Mybatis框架四:输入参数、输出参数

    输入参数可以有三种:简单类型,POJO,包装类 关于前两种: http://www.cnblogs.com/xuyiqing/p/8600888.html 这里写一下传递包装类参数: 一个POJO:U ...

  8. java并发机制锁的类型和实现

    synchronized 和 volatile,是最基础的两个锁! volatile是轻量级锁,它在多核处理器开发中保证了共享变量的可见性.即当一个线程修改一个共享变量时,其他线程能够读到这个修改的值 ...

  9. Lombok的@Data、@Setter、@Getter注解没反应问题解决

    在用@Data注解时,没有生成setter/getter方法.百度了一堆都没解决方法,后来用Google查了一下解决了~~~ 使用IDEA需要安装Lombok插件,我这里已经下载好,如果没下载安装点击 ...

  10. 谷歌浏览器提示Adobe flash player不是最新版本的解决方法

    版权声明:本文为博主原创文章,未经博主允许不得转载. 参考资料 https://jingyan.baidu.com/article/a3a3f811c3d5058da2eb8a39.html 如果电脑 ...