1. 路由技术 ( 详细记录 )

是笔记不是博文,觉得写的不够详细的可以使用Ctrl + W组合键

路由跳转页面

1. HTML 中使用 routerLink 属性路由进行跳转,传值时使用 queryParams 属性

<ion-item routerLink="/info1" [queryParams]="{name: '张'}">
<ion-label>页面跳转</ion-label>
</ion-item>

2.1 通过 router 实现编程式导航以及携带参数 ( 官方推荐 ):

export class Tab1Page {
constructor(public router: Router) {}
openInfo1(){
this.router.navigate(["info1"], {
queryParams: {name: "张"}
})
}
}

2.2 通过 router 实现编程式导航以及携带参数:

export class Tab1Page {
constructor(public router: Router) {}
openInfo2(){
this.router.navigate(["info1", {name: "张"}])
}
}

3. 通过 NavController 实现编程式导航以及携带参数:

export class Tab1Page {
constructor(public navCtrl: NavController) {}
openInfo3(){
this.navCtrl.navigateForward("info1", {
queryParams: { name: "张" }
})
}
}

返回到上一页面

1. HTML 中进行返回,slot 属性为 start 时按钮在左侧,end 则在右侧

<ion-header>
<ion-toolbar>
<!-- slot="end" -->
<ion-buttons slot="start">
<ion-back-button></ion-back-button>
</ion-buttons>
<ion-title>info1</ion-title>
</ion-toolbar>
</ion-header>

2. 通过 router 编程式导航进行返回

export class Info1Page {
constructor(public router: Router) { }
back(){
/*
* 返回到指定页面,严格点说是基于返回的动画执行的打开页面的操作
* 例如我从info1打开info2,从info2中使用router.navigateByUrl返回到info1
* 正常的返回什么都不会发生,但是这种会重新触发info1的生命周期函数
*/
this.router.navigateByUrl("/tabs/tab1");
}
}

3.1 通过 navController 编程式导航进行返回

export class Info1Page {
constructor(public navCtrl: NavController) { }
openInfo2(){
this.navCtrl.navigateForward("info2")
}
back(){
/*
* 这种返回是基于路径的历史记录进行返回的,他在后退的时候回根据上一个打开的页面进行返回
*
* 例如打开info1,然后打开info2,info2使用router.navigateByUrl进行返回,由于
* router.navigateByUrl是基于返回的动画执行的打开操作,所以info1使用nav.back进行
* 返回的时候就会进入死循环,而且由于打开顺序的问题,动画也会被改变
*/
this.navCtrl.back();
}
}

3.2 通过 navController 编程式导航进行返回

export class Info1Page {
constructor(public navCtrl: NavController) { }
openInfo2(){
this.navCtrl.navigateForward("info2")
}
back(){
/*
* pop不同于之前的函数,他是基于路由层级进行后退而不是基于历史记录进行后退
* 可以说从根本上就可以解决 3.1 中出现的死循环问题
*/
this.navCtrl.pop();
}
}

接收路由传参

路由的跳转 ( 打开以及返回 ) 基本已经掌握了,接下来开始学习获取路由传参的四种方法,路由传参的方法有很多种,不同的传参方式,接收的方法也不太相同,不过他们有一个共同点:使用的都是 ActivatedRoute

1.1 获取路由传参的第一种方式

export class Info1Page {
constructor(public navCtrl: NavController, public navParam: ActivatedRoute) {
navParam.queryParams.subscribe( param=>{
console.log(param);
})
console.log("取值完毕!");
}
}

这种方式是在 queryParams 中获取路由携带参数,适用于之前提到路由传参的【1】【2.1】【3】位置,但是这种获取方式有一个问题,subscribe 是异步的,也就是说 log("取值完毕!") 的执行会优先于 log( param ),这样在获取值后的操作就会显得没有那么方便

1.2 获取路由传参的第一种方式 ( 同步 )

想要同步取值也不难,只需要改变一下代码:

export class Info1Page {
constructor(public navCtrl: NavController, public navParam: ActivatedRoute) {
// 通过 snapshot 就可以实现同步获取
console.log(navParam.snapshot.queryParams);
console.log("取值完毕!");
}
}

2.1 获取路由传参的第二种方式

export class Info1Page {
constructor(public navCtrl: NavController, public navParam: ActivatedRoute) {
navParam.params.subscribe( param=>{
console.log(param);
})
console.log("取值完毕!");
}
}

params 中也可以获取路由携带参数,适用于之前提到路由传参的【2.2】位置,同样这种获取方式还存在异步问题,获取值后的操作也没那么方便,解决方案也是一样的

2.2 获取路由传参的第二种方式 ( 同步 )

export class Info1Page {
constructor(public navCtrl: NavController, public navParam: ActivatedRoute) {
// 通过 snapshot 就可以实现同步获取
console.log(navParam.snapshot.params);
console.log("取值完毕!");
}
}

实现页面重复打开

当我们在列表页打开一个详细信息页面的时候,一般会传递一个 ID 在详细信息页面进行查询,如果我们在详细信息页面同样还要打开一个详细信息页面时,路由重复,这样页面就不会有任何操作,这里推荐的解决方案是一种新的传值方式

例如我要重复打开 info1 页面:

1. 首先在路由上动手脚:app-routing.module

const routes: Routes = [
{
path: '',
loadChildren: () => import('./tabs/tabs.module').......省略
},
{
path: 'info1',
loadChildren: () => import('./info1/info1.module').......省略
},
// 新增这样一个路由,代表接收变量名为time的值,以/的方式进行传值
{
path: 'info1/:time',
loadChildren: () => import('./info1/info1.module').......省略
}
];

2. 然后在需要重复打开的页面中修改访问路径

export class Info1Page {
constructor(public navCtrl: NavController) { }
openInfo1(){
// 在访问路径后面拼【接斜线+毫秒值】,使用毫秒值的原因就是防止值重复
this.navCtrl.navigateForward("info1/" + new Date().getTime());
}
}

最终访问的路径就变成了: http://localhost:4200/info1/1601452910158,可以解决重复访问问题

上面的 1601452910158 毫秒值代表的就是 time 变量对应的值,这也属于路由传值的一种,如果想要在页面上获取到这串毫秒值可以使用路由接收传参的【2.1】或【2.2】

Ionic5路由跳转传值复用的更多相关文章

  1. ionic4 路由跳转、ionic4 路由跳转传值 NavController 返回上一页 、NavController 回到根

    1.普通路由跳转 <ion-button [routerLink]="['/pinfo']"> 跳转到详情 </ion-button> <ion-he ...

  2. 16Flutter中的路由 基本路由 基本路由跳转传值(上)

    /* Flutter中的普通路由.普通路由传值.命名路由.命名路由传值 Flutter中的路由通俗的讲就是页面跳转.在Flutter中通过Navigator组件管理路由导航. 并提供了管理堆栈的方法. ...

  3. Angular配置路由以及动态路由取值传值跳转

    Angular配置路由 1.找到 app-routing.module.ts 配置路由 引入组件 import { HomeComponent } from './home/home.componen ...

  4. angular中路由跳转并传值四种方式

    一.路由传值 步骤1 路由传递参数 注意 一定是要传递 索引值 let key = index 这种情况是在浏览器中可以显示对应的参数 这种的是问号 localhost:8080/news?id=2& ...

  5. 路由传值及获取参数,路由跳转,路由检测,this.$route.query和this.$route.params接收参数,HttpGet请求拼接url参数

    配置动态路由参数id: routes: [ // 动态路径参数 以冒号开头 { path: '/user/:id', component: User } ] html路由跳转: <router- ...

  6. vue当前路由跳转初步研究

    一样闲话少说,直接上问题,如图: 也是消息面板,没想到一个小小的消息面板,碰到这么多坑,惆怅. 就是如果当前路由和跳转路由不一样时,正常跳转没有任何问题.但是如果一样时,就不会跳转了,用了很多方法,比 ...

  7. Reactjs之静态路由、动态路由以及Get传值以及获取

    1.新增知识点 /* react路由的配置: 1.找到官方文档 https://reacttraining.com/react-router/web/example/basic 2.安装 cnpm i ...

  8. vue根据参数不同的路由跳转以及name的作用

    最近在做VUE路由跳转根据参数的值不同但是跳转的是同一个路由的功能.点击左边的目录,根据目录ID跳转不同的列表.如下图. 路由跳转的代码: this.$router.push({path: '/RFI ...

  9. vue常用操作及学习笔记(路由跳转及路由传参篇)

    路由跳转 - 超链接方式跳转 html: <div id="app"> <h1>Hello App!</h1> <p> <!- ...

随机推荐

  1. 解决异常: Execution default-cli of goal org.mybatis.generator:mybatis-generator-maven-plugin:1.3.7:generate failed: Cannot instantiate object of type tk.mybatis.mapper.generator.MapperPlugin -> [Help 1]

    mybatis-generator整合通用mapper使用generator插件生成model.mapper时报错: 产生以下错误:↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 解决办法: ...

  2. docker轻量级监控-sysdig

    sysdig Sysdig = system(系统)+dig(挖掘).Sysdig 是一个开源系统发掘工具,用于系统级别的勘察和排障,可以把它看作一系列Linux系统工具的组合,主要包括: strac ...

  3. WPF -- 自定义按钮

    本文介绍WPF一种自定义按钮的方法. 实现效果 使用图片做按钮背景: 自定义鼠标进入时效果: 自定义按压效果: 自定义禁用效果 实现效果如下图所示: 实现步骤 创建CustomButton.cs,继承 ...

  4. 使用 xunit 编写测试代码

    使用 xunit 编写测试代码 Intro xunit 是 .NET 里使用非常广泛的一个测试框架,有很多测试项目都是在使用 xunit 作为测试框架,不仅仅有很多开源项目在使用,很多微软的项目也在使 ...

  5. Oracle VM VirtualBox的下载和安装

    软件介绍 VirtualBox 是一款开源虚拟机软件,由德国 Innotek 公司开发,由Sun Microsystems公司出品的软件,使用Qt编写,在 Sun 被 Oracle 收购后正式更名成 ...

  6. 215. 数组中的第K个最大元素 + 快速排序 + 大根堆

    215. 数组中的第K个最大元素 LeetCode-215 另一道类似的第k大元素问题:https://www.cnblogs.com/GarrettWale/p/14386862.html 题目详情 ...

  7. 剑指 Offer 56 - II. 数组中数字出现的次数 II + 位运算

    剑指 Offer 56 - II. 数组中数字出现的次数 II Offer_56_2 题目详情 解题思路 java代码 package com.walegarrett.offer; /** * @Au ...

  8. pytorch(00)

    pytorch入门到项目(-) 一.pytorch的环境 本身项目采用win10系统+pycharm+anaconda+cuda. 其中版本为 python 3.7 anaconda 5.3.1 cu ...

  9. 从零搭建一个IdentityServer——单页应用身份验证

    上一篇文章我们介绍了Asp.net core中身份验证的相关内容,并通过下图描述了身份验证及授权的流程: 注:改流程图进行过修改,第三方用户名密码登陆后并不是直接获得code/id_token/acc ...

  10. 如何在Bash脚本中引入alias

    更多精彩内容,请关注微信公众号:后端技术小屋 alias的使用 在日常开发中,为了提高运维效率,我们会用alias(命令别名)来定义命令的简称.比如在~/.bash_profile中添加: alias ...