本文转自:https://www.jianshu.com/p/de40aeb3d371

往期传送门
来扯点ionic3[0] 吹完牛再入门也不迟
来扯点ionic3[1] 创建一个新页面

 
 

上一次我们完成了一个新页面的创建
可能你被乱七八糟的概念搞得心烦意乱
不过你那么聪明又那么好看
我相信你肯定花了点时间就把他们搞懂了

我们先看看手里有几个页面?

  • AboutPage
  • ContactPage
  • HomePage
  • TestPage

我们要做什么?
在HomePage上放一个页面,点击之后跳转到TestPage.

怎么做?
可谓非常简单,只需要完成三步。

1.实践:喜欢我就点我啊

1.1 开始前:复原上一节的初始状态

  • 文件:pages/tabs/tabs.ts

上一次我们为了观察新创建的TestPage,直愣愣把首屏的HomePage给替换掉了,我们先把他恢复原状:

  1. 将 tab1Root 重新指向 HomePage
  2. 删除 TestPage 的 import 语句
import { Component } from '@angular/core';

import { AboutPage } from '../about/about';
import { ContactPage } from '../contact/contact';
import { HomePage } from '../home/home'; @Component({
templateUrl: 'tabs.html'
})
export class TabsPage { tab1Root = HomePage;
tab2Root = AboutPage;
tab3Root = ContactPage; constructor() { }
}

直接serve运行本地服务器,一切又完好如初,画面太美不敢看。

1.2 在HomePage搞一个按钮

  • 文件: pages/home/home.html

把原来 ion-content 里的内容删除,加入这一个这样的按钮

<button ion-button>喜欢我就点我呀</button>

没错是你熟悉的那个button标签
ion-button 是一个内置指令
让按钮在视觉上呈现出与操作系统相符的效果

 
iOS下按钮的效果
 
不加指令的话,额…

1.3 在HomePage组件中引入TestPage

  • 文件: pages/home/home.ts
  1. 引入 TestPage
  2. 在 HomePage 类中定义 testPage 属性;
  3. 在构造函数中农将 testPage 指向 TestPage,以便模板可以使用。
import { Component } from '@angular/core';
import { NavController } from 'ionic-angular'; import { TestPage } from '../test/test'; @Component({
selector: 'page-home',
templateUrl: './home.html'
})
export class HomePage { testPage; constructor(public navCtrl: NavController) {
this.testPage=TestPage;
} }

1.4 页面一线牵

  • 文件:pages/home/home.html
  • 为button加上 [navPush] 指令
<button ion-button [navPush]="testPage">喜欢我就点我呀</button>

这时我们切换到浏览器,点击Home页面上的按钮,发现页面流畅地切换到了Test上去了。

 
 

2.在业务逻辑中实现跳转

刚才,我们通过了 [navPush] 指令,让模板中的按钮“超链接”到了一个新页面。但是在更复杂的场景中,这样简单的链接可能不能符合我们的需求。比如我们需要在用户点击按钮时,进行一些业务处理,再跳转到下一个页面,这时候就可以利用NavController中的push方法来实现,同样也只有三步:

2.1 引入 NavController

ionic把app的众多交互封装成了若干个controller,其中NavController就是用来管理和导航页面的一个controller。由于几乎每一个页面都会用到NavController,我们发现在HomePage中已经有了引入语句了。

import { NavController } from 'ionic-angular';

此外,类的构造函数定义了一个NavController类型的参数,以告诉angular在创建页面时,需要传入(注入)一个NavController的实例.

constructor(public navCtrl: NavController){
}

2.2 使用push方法来进行跳转

在类中编写一个方法,我们就叫它pushTestPage吧,调用navCtrl对象的push方法,将页面导航到TestPage上

pushTestPage(){
this.navCtrl.push(TestPage);
}

此时文件 home.ts 的完整代码

import { Component } from '@angular/core';
import { NavController } from 'ionic-angular'; import { TestPage } from '../test/test'; @Component({
selector: 'page-home',
templateUrl: './home.html'
})
export class HomePage { constructor(public navCtrl: NavController) {
} pushTestPage(){
this.navCtrl.push(TestPage);
} }

2.3 将方法绑定到按钮点击事件

在home.html中,为button元素绑定click事件

<button ion-button (click)="pushTestPage()">喜欢我就点我呀</button>

为什么不是 onclick="pushTestPage()" 因为 pushTestPage 不是一个全局函数,它是 TestPage 组件中的一个方法,经过封装之后早已对外不可见,不过可以通过使用(click) 指令来直接调用组件内的方法。

这样我们就可以在pushTestPage里添加更加复杂的业务逻辑,以满足我们的需求。

3.将参数传递给下一个页面

有时我们完成了一个页面上的业务之后,要把相关的数据传给下一个页面处理,这时候就需要向被push的页面传入相关的参数。NavController的push方法的第二个参数接收一个对象。

3.1 为push函数添加第二个参数

假设我们要为TestPage传入一个标题,用来显示到页面上,我们为push方法传入一个对象。

 pushTestPage(){
this.navCtrl.push(TestPage,{
title:'没有人可以比我帅'
});
}

3.2 引入NavParam并使用

利用NavParams的get方法,可以将传进来的页面参数读取出来。
切换到 test.ts,完成三个步骤
1.引入NavParams并,并在构造函数添加注入语句
2.为TestPage类添加title属性,读取参数并赋给title
3.将title输出到模板中

  • 文件 test.ts
import { Component } from '@angular/core'

import { NavParams } from 'ionic-angular' //step1

@Component({
selector: 'page-test',
templateUrl:'./test.html'
})
export class TestPage { title:string; //step2 constructor(public params:NavParams){ //step1
this.title=this.params.get('title'); //step2
}
}
  • 文件 test.html
    如果很多场景的模板引擎,在模板中利用双花括号 {{ }} 将组件的属性输出到界面上。
<ion-header>
<ion-navbar>
<ion-title>
Test
</ion-title>
</ion-navbar>
</ion-header>
<ion-content>
<!--[step3]-->
<h1>{{title}}</h1>
</ion-content>
 
 

4. 老司机必会:手动返回

如同进入页面,我们在退出页面的时候,除了用户点击返回按钮外,也有可能在完成了业务之后,自动返回上一个页面,这时候可以使用NavController的pop方法来实现。

  • 文件 test.ts
import { Component } from '@angular/core'

//注意这里
import { NavController, NavParams } from 'ionic-angular' @Component({
selector: 'page-test',
templateUrl:'./test.html'
})
export class TestPage { title:string; //注意这里
constructor(public navCtrl:NavController,public params:NavParams){
this.title=this.params.get('title');
} //新方法
popPage(){
this.navCtrl.pop();
}
}
  • 文件 test.html
    在模板中添加返回按钮
<ion-header>
<ion-navbar>
<ion-title>
Test
</ion-title>
</ion-navbar>
</ion-header>
<ion-content>
<h1>{{title}}</h1>
<button ion-button (click)="popPage()">返回</button>
</ion-content>
 
 

5. 扩展内容:ionic的页面机制

过往我们在网页上进行页面之间的链接,是通过<a>标签来实现的。而我们现在制作的 web APP,虽然使用了前端技术,但页面的概念跟之前却所有不同。

ionic APP在编译过后,实际上只有一个index.html网页,它是一个单页面应用。你所看到的页面之间的切换,实际上都是利用 js 来替换界面上的元素,并不是传统意义上的网页之间的跳转。因为传统的网页跳转,是需要向服务器发送请求并下载资源的,即便再快的网速都会有一定的响应时间。这在浏览器上非常正常,但如果是在手机APP上,这样的响应时间会严重影响操作的流畅性。而单页面已经加载了基础的资源,在操作过程中,只需要替换部分的内容,请求部分的资源,配合一些交互设计,让操作没有卡顿感。所以在移动web盛行的今天,单页面应用也是一种大势所趋。

ionic APP中的页面实质上是一个栈的结构(实际上多数原生应用也是这样的),但从当前页面上引入一个新页面时,浏览器(或操作系统)会加载新页面的资源,然后把它添加到栈顶。在界面上的表现就是,新页面“遮住了”原有的页面,下层页面的内容和资源依旧在内存中。

 
 

而上层页面被pop掉的时候,上层页面弹出栈,相应的内存被释放(在图中栈顶由C变成了B),在视觉表现上就是上面的页面被“移开”了,下层的页面“暴露了出来”。

 
 

所以APP中的页面是有层级关系的,用户在首页一层一层地进入了新页面(A->B->C),回到首页时就得一层一层退出来(C->B->A),所以我们在设计页面的时候,脑海中有明确这样的层级关系,如果栈的层次过多了(超过了5层),就会给用户体验带来困扰。

最后提一下TabsPage,TabsPage可以被理解层一个特殊的页面,这个页面中又包含了若干个页面栈(Tab),每个页面栈相互独立,通过Tab按钮来相互切换。一个页面栈中的push和pop不会影响到其它栈的表现,也就是当你在不同的tab中切换时,看到的响应的栈顶页面。

 
 

下一章:来扯点ionic3[3] 页面的生命周期事件,也就是凡间所说的钩子

作者:忠叔
链接:https://www.jianshu.com/p/de40aeb3d371
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

[转]来扯点ionic3[2] 页面一线牵 珍惜这段缘的更多相关文章

  1. 来扯点ionic3[3] 页面的生命周期事件,也就是凡间所说的钩子

    首先要做一个诚挚的道歉,作为大四狗,因为升学的事情,断更两个月,所以要感谢各位仁慈的读者没有脱粉(好像也就50个粉丝).这一节,我们延续上一节制作的页面,来讨论声明周期钩子的事情. 以我的经验来看,多 ...

  2. [转]来扯点ionic3[7] LocalStorage的使用—以登录和注销为例

    本文转自:https://segmentfault.com/a/1190000012146400 一般意义上,一个互联网 APP 中的数据主自与服务器的交互,但是对于有些数据,我们希望获取到它们以后能 ...

  3. 来扯点ionic3[7] LocalStorage的使用—以登录和注销为例

    一般意义上,一个互联网 APP 中的数据主自与服务器的交互,但是对于有些数据,我们希望获取到它们以后能保存,并在全局环境使用,比如用户数据--我们不希望在每个页面都从服务器拉取一遍.这时我们就可以利用 ...

  4. Ionic3新页面去除Tabs的菜单问题总结

    问题 要求在[我的]页面,点击[退出登录]按钮,返回到登录页面. 使用 this.navCtrl.setRoot(LoginPage); 或者 this.navCtrl.push(LoginPage) ...

  5. ionic3+angular5页面间传递参数

    一.从一个页面跳转到另一个页面的方法 1.引入服务 import { NavController } from 'ionic-angular'; 2.初始化 constructor(public na ...

  6. ionic3 修改页面切换动画

    在app.module.ts中 配置pageTransition属性 [ BrowserModule, IonicModule.forRoot(MyApp, { pageTransition: 'io ...

  7. vue 浏览器页面刷新时执行一段代码

    当刷新(浏览器刷新)页面的时候,重置到首页(或其他页面)纯js的是window.onload()但是vue几乎不会用到这个,vue所有的是生命周期那么我们可以根据生命周期来实现这个beforeCrea ...

  8. Angular4.x+Ionic3 踩坑之路之 Ionic3.x pop反向传值

    1.Ionic3.x 页面正向传值 关于正向传值,上一篇文章里面有讲,具体可以看这里https://segmentfault.com/a/11... 2.Ionic3.x 页面 pop反向传值,主要有 ...

  9. Nova PhoneGap框架 第三章 页面

    页面在项目架构中是一个很重要的概念,它让我们能够将一个功能复杂的项目拆分成一个一个功能比较独立的小区域,这极大的提高了代码的可读性和可维护性. 在我们这个框架中,一个页面由JS和HTML两部分组成,首 ...

随机推荐

  1. CSS3知识!

    一.引入样式 1.行内样式表 <h1 style="color: red;font-size: 18px;">10-30</h1> 2.内部样式表(在hea ...

  2. linux_vim编辑文件无法高亮显示解决方法

    打开/etc/vimrc(/etc/vim/vimrc不同版本,可能不一样) 在文档最后添加下面内容 syntax on 如图所示:我添加了高亮显示和显示行数 syntax on set nu 修改完 ...

  3. var

    在函数中,使用var声明的变量,为局部变量,只能在函数内部访问. 不使用var声明的变量,为全局变量,在函数外边也能访问. 没有var的情况 <script type="text/ja ...

  4. 2019.02.12 bzoj5294: [Bjoi2018]二进制(线段树)

    传送门 题意简述: 给出一个长度为nnn的二进制串. 你需要支持如下操作: 修改每个位置:1变0,0变1 询问对于一个区间的子二进制串有多少满足重排之后转回十进制值为333的倍数(允许前导000). ...

  5. Note | 学术论文写作方法和技巧

    目录 1. 论文发表流程 2. 确定科研方向 3. 思考问题和解决问题 4. 审稿 5. 论文写作 5.1. 标题 5.2. 摘要 5.3.介绍 5.4. 相关工作 5.5. 段落 5.6. 方法 5 ...

  6. _ZNote_Qt_定时器的总结

    Qt中实现定时器有两种方法. 一种是使用QObject类定时器;一种是使用QTimer类定时器.(定时器的精度依赖于操作系统和硬件,大多数平台支持20ms) 1,QObject类定时器. 通过QObj ...

  7. MySQL--运维内参中的binlog_summary脚本

    #!/bin/bash ##===================================================## ## 脚本出自<MySQL运维内参> ##===== ...

  8. Android开发 - 设置DialogFragment全屏显示

    默认的DialogFragment并不是全屏,但有些需求需要我们将对话框设置为全屏(内容全屏),Android并没有提供直接的API,通过其它不同的方法设置全屏在不同的机型上总有一些诡异的问题,经过测 ...

  9. Java 虚拟机的对象创建

    堆中存储的内容:在程序运行时,动态创建的对象. 创建对象的四种方式:new,clone(浅复制),反射,反序列化. 浅复制:只能复制当前对象本身,如果当前对象(A)引用了另外的对象(B),则引用对象( ...

  10. Dispatch Queue 之 dispatch_async

     可以看到,在queue里的任务,不仅仅是一个函数,也可以是一个其他的queue. 下面是一个例子.  全局队列的处理 一般一个全局队列有多个线程,这些个线程会遍历并处理链表里的任务. 对于全局队 ...