来扯点ionic3[4] 结构型指令和列表渲染

往期传送门
来扯点ionic3[0] 吹完牛再入门也不迟
来扯点ionic3[1] 创建一个新页面
来扯点ionic3[2] 页面一线牵 珍惜这段缘
来扯点ionic3[3] 页面的生命周期事件,也就是凡间所说的钩子

《雷神3》上映已经一周,但因为各种原因还没来得去送票房,有多年不见的班纳和洛基娘娘,期待他们在《诸神黄昏》和明年《无限战争》中的表现。

之前在学习建立页面的时候已经体验过了模板插值(把变量展示在页面中),这一节便来挖掘更多的模板语法。

准备工作

方便起见,我们这次处理项目中的默认页面 ContactPage,在 contact.ts 中建立一个简单的数组成员。


contact.ts

在 contact.html 中清空 ion-content 标签的多余内容。


contact.html

至此,准备就绪,开始了解第一个指令。

重复性指令 ngFor

ngFor指令的作用是,将批量的数据(数组)结合HTML元素添加到页面DOM中,它的语法参照了ES6中的 for...of 语句:

for (let i of [1,2,3,4,5,6]) { ... }

基本的使用

ngFor指令基本语法:

*ngFor="let value of [1,2,3,4,5,6]"

使用时注意不要遗漏星号(*)。

尝试在 contact.html 中输出 data 数组:

<ion-content>
  <div *ngFor="let item of data">{{item}}</div>
</ion-content>

模板中渲染的数据和页面类中的属性成员是紧密绑定的,当属性发生变化,页面也会当即作出相应:

ionViewDidEnter(){
    setInterval(()=>{
        this.data.push(this.data.length + 1);
    },500)
  }

在上面的代码中,使用钩子添加了一个间隔定时器,每半秒钟向 data 数组中添加一个元素(在ionic3中,如果没有特殊的必要,请使用箭头函数代替传统的
function 声明
)。

动图:动态渲染效果

可见,在页面中,每半秒钟也会相应增加一个新的条目。

对象的渲染

在实际的开发中,我们更常会去处理一个对象数组,这时候我们通过点运算符(.) 输出数组的属性:

    data:any = [
        {name:'托尼·史塔克', birthYear:1970, gender:1, description:'钢铁侠'},
        {name:'史蒂夫·罗杰斯', birthYear:1920, gender:1, description:'美国队长'},
        {name:'娜塔莎罗·曼诺夫', birthYear:1928, gender:0, description:'黑寡妇'},
        {name:'索尔', birthYear:-5555,gender:1, description:'雷神'},
        {name:'克林顿·巴顿', birthYear:1974, gender:1, description:'鹰眼'},
        {name:'布鲁斯·班纳', birthYear:1975, gender:1, description:'绿巨人浩克'}
    ]; 

模板渲染:

<ion-content>
  <div *ngFor="let item of data">{{item.name}}</div>
</ion-content>
渲染效果

ionic的列表渲染

基本使用

在APP的开发中,对列表条目的渲染并非是通过 div 来承载的,ionic 提供了列表专用的标签 ion-list

<ion-list>
  <ion-item></ion-item>
</ion-list>

其中 ion-list 是列表容器, ion-item 是列表中的一个条目,当把 ion-item 和 ngFor 指令结合使用,就可以渲染出一个多条目的列表:

<ion-content>
  <ion-list>
    <ion-item *ngFor="let item of data">{{item.name}}</ion-item>
  </ion-list>
</ion-content>

更复杂一些的列表

ion-item 里可以通过不同元素的组织让列表承载更多信息


<ion-item *ngFor="let item of data">
  <h2>{{item.name}}</h2>
  <p>{{item.description}}</p>
</ion-item>
image.png

此外,ionic还提供一个指令 item-end 将指定的元素渲染在条目的尾部:

<ion-item *ngFor="let item of data">
      <h2>{{item.name}}</h2>
      <p>{{item.description}}</p>
      <p item-end>{{item.gender?'男':'女'}}, {{2017 - item.birthYear}} 岁</p>
    </ion-item>

注:漫威电影宇宙中超级英雄的出生年份不可考 :)

此处除了点运算符(.) 输出对象的属性,还使用了一个计算表达式和一个条件表达式,这些都是我们常见的用法。

加入头像

利用 ion-avatar 标签和 item-start 指令渲染一个有头像的列表:


ion-avatar标签的默认样式会自动对图片进行缩放和截取,呈现出如图所示的圆形效果,此外也有一种可以展示方形图片的 ion-thumbnail 标签(缩略图标签),你也可以通过CSS来修改头像的样式。
注:我事先已经准备好了图片素材并将每位hero的avatar属性写进了data中。

有条件地渲染:ngIf 指令

除了 ngFor ,还有一个非常常用的指令 ngIf ,通过一个表达式来判断元素是否会被添加到模板中。这一指令同样也是动态的:当表达式的值变为真,元素便会添加;当表达式的值变为假,元素会从模版中被移除。

*ngIf="isActive"

尝试用 ngIf 指令来晒先男性英雄

<ion-list>
    <ng-container *ngFor="let item of data">
      <ion-item *ngIf="item.gender===1">
        <ion-avatar  item-start>
          <img src="{{item.avatar}}">
        </ion-avatar>
        <h2>{{item.name}}</h2>
        <p>{{item.description}}</p>
        <p item-end>{{item.gender?'男':'女'}}, {{2017 - item.birthYear}} 岁</p>
      </ion-item>
    </ng-container>
  </ion-list>

这儿要说明的是,在angular中,*ngFor 和 *ngIf 不能放置在同一个标签上(Vue之类的框架则可以),因此在 ion-item 外加上一个“虚拟”的标签 ng-container, 它自身不会被渲染到DOM中,只会渲染它包裹的内容(类似Vue中的 template 标签)。因此在没有 ngIf 的情况下,把 ngFor 指令加在 ion-item 上和加在外层的 ng-container 标签上效果是等同的;而在有 ngIf 指令的情况下,可以通过 ng-container标签避免两个指令的冲突

参考文档

  1. Angular结构型指令
  2. Ionic List API Docs
  3. Ionic Item API Docs

下一章:来扯点ionic3[5] 轻松上手表单:这些组件可以玩一年

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

推荐阅读更多精彩内容