Ionic3入门与常见问题

一.前言

介绍一个比较火的混合开发技术框架,ionic。之前使用过framework7,但是接触到ionic后,感觉两者的差距还是蛮大的,如果你想要开发功能比较复杂的app,建议还是使用ionic

二.简单介绍

简单介绍一下,ionic是一款html5手机应用开发框架,它提供了很漂亮、交互性好的UI组件,可以让我们快速开发;基于原生的API,我们可以通过插件的形式来实现原生的功能。官方网站更新很快,而且文档也描述地很详细。在GitHub上可以快速提出issue,ionic team会快速跟进。

三.快速入门

当然,要快速开发ionic app,基本的前端技术肯定是要会的,html+javascript+css
ionic它是基于Cordova框架的,所以要进行ionic开发的话,那么需要安装npm,node.js,Cordova,这些都可以在网上查找相关的资料进行安装。
ionic是通过typescript来进行开发的,typescript是基于javascript的一层封装,所以要是typescript不是很熟悉的话,用javascript来开发也是可以的,在ionic项目中,新建出来的文件是html文件,ts文件以及scss文件。一般的话,每一个页面都是包含这三个文件。
接下来,我们开始创建app
1)首先,通过命令行安装ionic:

npm install -g ionic

2)创建一个app,ionic有3种模版给你选择,一个是空白模版,一个是tabs模版,另外一个sidemenu模版。现在用的比较多的就是tabs模版:

ionic start myApp tabs

其中的myApp就是项目的名字。
3)还有一步就是run起app,看看你之前的安装的步骤是否正确,首先需要进入这个项目的路径,其次就是调用ionic命令运行app:

cd myApp
ionic serve

注意,通过ionic serve跑起来的是以浏览器的方式,你也可以选择要运行的浏览器,默认是电脑的默认浏览器。
本人比较喜欢用chrome,命令行为:

ionic serve -w google\ chrome

因为chrome浏览器在检查元素的时候特别方便,清晰。
还有一点,当你在修改代码的时候,浏览器也会自动实时刷新,这样就大大提高了开发的效率,不需要自己重新去跑浏览器。
注意,有时候ionic自动刷新,会出现缓存,这样会导致项目报错,但是实际上,这个项目是没有错误的代码的,所以需要重新运行serve,例如用的是chrome,那么:

ionic serve -w google\ chrome

以上创建出来一个app了,之后需要进行其他的业务逻辑,则需要创建页面来开发。

三.添加新页面

通过快速入门,此时你已经搭建了一个基本的框架,如果要进一步的开发,需要创建一些新的页面。
本人用的是webstorm开发神器来开发ionic项目,用webstorm打开刚刚创建的项目myApp,然后找到文件夹pages,右击创建一个文件夹,例如为about,在这个文件夹下面创建三个文件,分别为about.html,about.ts,about.scss,一般都是创建这三个,如果不需要用到某一个文件,那么也可以不需要创建。

1.三个文件需要写什么代码
1)对于ts文件
创建完这三个文件之后,在about.ts的@component的selector中写上page-about,templateUrl写上about.html。

@component({
selector:'page-about',
templateUrl:'about.html'
})

其中selector中写上page-about,代表这个ts文件关联的scss是哪一个,此时需要在about.scss文件里面写上:

page-about{
}

为何要在scss文件写上这句代码?因为后面在定义样式的时候,可能有多个页面用到重名的样式,例如about page里面有一个样式叫about-title,在另外一个page,也有叫做about-title,这样会导致样式的覆盖。
templateUrl写上about.html,就不用多说了,意思就是这个ts文件的模版关联了这个html文件。
定义页面名字,用于后面的导入:

export class AboutPage {
}

其中AboutPage就是你定义的这个页面的名字,在后面导入app.module.ts会讲到。
2)对于html文件
一般都会用到ion-headerion-contention-footer,顾名思义,这个就是app对应的头部,内容和底部,这个根据你的需要来创建。
3)对于scss文件
写上

page-about{
}

后面这个页面的所有样式就写在page-about的大括号里面,防止样式的覆盖。
上面的三个小步骤是对于最初创建ionic页面的时候需要写些什么基本代码。接下来就是需要将你创建的页面与这个项目项关联起来。

2.关联页面
1)首先,去到项目的app文件夹,再去到app.module.ts文件,导入刚刚创建的页面:

import { AboutPage } from '../pages/about/about';

其中AboutPage就是刚刚定义的页面的名字。
2)在declarations中导入AboutPage ,在entryComponents中导入AboutPage。

3.页面的方法

ionViewDidLoad(){
  console.log("ionViewDidLoad 当页面加载的时候触发,仅在页面创建的时候触发一次");
}

ionViewWillEnter(){
  console.log("ionViewWillEnter当将要进入页面时触发");
}

ionViewDidEnter(){
  console.log("ionViewDidEnter 当进入页面时触发");
}

ionViewWillLeave(){
  console.log("ionViewWillLeave 当将要从页面离开时触发");
}

ionViewDidLeave(){
  console.log("ionViewDidLeave 离开页面时触发");
}

ionViewWillUnload(){
  console.log("ionViewWillUnload 当页面将要销毁同时页面上元素移除时触发");
}

ionViewCanEnter(){
  console.log("ionViewCanEnter");
}

ionViewCanLeave(){
  console.log("ionViewCanLeave");
}

上面几个方法在实际开发中用的比较多的是ionViewDidLoad,第一次进入这个页面的时候调用此方法,这个和原生的iOS的方法viewDidLoad基本是同一个意思。数据请求经常是写在这个方法里面,还有一些元素的动态添加等等。这样不会导致每次进入页面都需要进行数据请求和页面元素的添加。当然,实际的开发是怎么样,就需要根据你自己的情况来选择方法。

以上是ionic的页面导入步骤。至此,你就可以进行ionic开发了,页面已经关联起来了。ionic提供了大量的UI组件,可以大大提高开发速度,在官网上面有很全面的介绍和demo演示。
下面我就介绍进一步的开发和一些开发中遇到的问题。

四.导入插件

在ionic的官网上面有很多插件,可以自行查找。
我们以keyboard插件为例子。
1.安装

ionic cordova plugin add cordova-plugin-ionic-keyboard
npm install --save @ionic-native/keyboard

其中@ionic-native/keyboard是指将keyboard安装到ionic-native文件夹下。

2.在app.module.ts文件需要导入:

import { Keyboard } from '@ionic-native/keyboard';

还需要在providers中需要写入Keyboard,这样就完成了一个插件的导入。

3.使用
如果你需要在about page中使用这个插件,那么需要在ts文件中:
1)导入

import { Keyboard } from '@ionic-native/keyboard';

2)在constructor中声明一下实例:

constructor(private keyboard: Keyboard){}

3)在ts文件中调用你需要的API,如:

this.keyboard.hideFormAccessoryBar(false);

五.共用工具方法

在实际的开发中,例如iOS原生开发,我们会使用添加.h文件和.m文件来封装共用方法,然后通过实例方法或者类方法来调用,前端开发可能我们就单独抽取出一个js文件来封装共用方法,但是现在我们是用的是ionic框架开发,不像前端开发直接在html导入js文件,当然我们可以在index.html文件中直接导入,但是ionic也我们提供了统一的方式-provider。
假如我们需要共用一个loading,那么我们此时可以创建一个provider,步骤为:
1.生成这个共用方法

ionic g provider method

其中method就是这个共用方法的名字,ionic会自动帮你创建好这个文件在项目的providers文件下面。
去到method.ts文件中,写入代码:
1)导入

import {LoadingController} from "ionic-angular";

2)声明

constructor(
  private loadingCtrl: LoadingController
) {}

3)实现方法

showLoading(){
  this.loading = this.loadingCtrl.create({});
  this.loading.present();
}

2.使用共用方法
1)在需要使用这个loading的方法的页面导入

import { MethodProvider } from '../../providers/method/method';

其中MethodProvider就是你创建的那个共用方法的名字,在method.ts中找到这个名字。
2)声明实例

private methodProvider: MethodProvider,

3)调用方法

this.methodsProvider.showLoading();

六.数据请求

在ionic中的数据请求有2种,一个是angular数据请求,另一种是原生http数据请求。
1.angular数据请求
1)导入:

import {HttpClient} from "@angular/common/http";

2)声明:

private http: HttpClient

3)使用:

this.http.post(MyApp.SERVER + this.path, params, {}).subscribe(res => {
// 网络请求发生成功
  let resObj = JSON.parse(JSON.stringify(res));
  console.log("---resObj--" + resObj);
}, err => {
  // 网络请求发生错误
});

注意,在真机测试中,angular数据请求不会起作用。

2.原生http数据请求
1)安装和导入

ionic cordova plugin add cordova-plugin-advanced-http
npm install --save @ionic-native/http

在需要的页面中导入

import {HTTP} from "@ionic-native/http";

2)声明

private nativeHttp: HTTP

3)使用

this.nativeHttp.setDataSerializer('json');
this.nativeHttp.post(MyApp.SERVER + this.path, params, {})
  .then(data => {
    let resObj = JSON.parse(data.data);
    console.log("---resObj--" + resObj);
  })
  .catch(error => {
  });

在浏览器中,原生http请求是不起作用的。
所以,在实际的代码开发中需要根据platform来区分需要的数据请求方式。
注意,有时候你区分了使用方式,但是就是一直报错,而且通过postman测试API是没有问题的,那么此时需要注意2点:
1)请求的API,后台是否解决了跨域的问题。
2) ionic项目需要移除一下whitelist,然后重新再添加进去。

ionic cordova plugin rm cordova-plugin-whitelist
ionic cordova plugin add cordova-plugin-whitelist

七.注意点

1.启动图
ionic项目的启动图插件在创建项目的时候,是默认帮我们添加了,在iOS上面是没有问题的,在config.xml中加入:

<splash src="src/assets/imgs/ios/Default@2x~universal~anyany.png" />
<splash src="src/assets/imgs/ios/Default@3x~universal~anyany.png" />

其中Default@2x~universal~anyany.png的大小为2732*2732,为
Default@3x~universal~anyany.png的大小为2208*2208,具体可以Cordova官网,上面有详细的介绍: splashscreen
但是接下来在config.xml中导入android的代码时候,就一直出不来启动图,后面发现是android的splashscreen没有安装,所以就安装了一下这个插件:

ionic cordova plugin add cordova-plugin-splashscreen

会发现,在安装的过程中,提示iOS已经安装,但是android没有安装。
安装成功之后,android的启动图就出现了。

2.virtual scroll
ionic3版本,如果使用ion-segment的话,并且ion-segment对应的有使用到list的话,就不能使用virtual scroll,否则会出错,这个virtual scroll找不到了。在GitHub上有很多人提出了这个issue,本人也查找了里面讨论的内容,有人说是用hidden可以解决,但是实际上是没有用的,原因就是ion-segment本身也是类似于判断的意思,但是对于virtual scroll而言,在ion-list上面不能有*ngIf,否则就会找不到这个virtual scroll。

3.android硬件返回事件处理
在网上面找到很多关于android硬件返回按钮处理的方法,其中一篇文章写的比较好的文章,它是通过抽成一个公用的方法,然后在tabs文件夹中创建定义一个registerBackButtonAction方法即可,除非是有特殊页面,例如login页面,需要重新定义registerBackButtonAction,因为点击login页面的android硬件放回按钮,是要退出app的。
这样做是没有问题的,但是本人遇到有一个页面是通过ModalController来跳转页面的,此时如果还是使用它的方法就会出错,因为它没有区分出modal的情况。所以在这个ModalController页面,点击返回,会直接退出app。
在网上查找了一种也是大致相同的方法,但是返回事件是在app.component.ts文件中定义了,增加判断面是否有toast或loading或Overlay,如果有的话,需要先隐藏,这样就避免了直接退出app,导入的IonicApp如果应用在抽成一个公用的方法里面会出现报错。所以关于android硬件返回按钮的处理事件,还是放在了app.compoent.ts文件中处理。
注意,注册registerBackButtonAction需要写在platform.ready里面,而且需要做一下延时。

八. 总结

总体而言,ionic是一个很不错的手机应用开发框架,版本的更新很快,文档齐全,用户体验好,近乎原生,而且有一个强大的讨论社团,对于bug的跟进速度很快,而且对于后面app的更新迭代有很大帮助。如果你要开发一个稳定,快速迭代的app,推荐使用ionic。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,012评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,589评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,819评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,652评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,954评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,381评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,687评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,404评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,082评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,355评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,880评论 1 255
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,249评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,864评论 3 232
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,007评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,760评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,394评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,281评论 2 259

推荐阅读更多精彩内容