小程序实战视频课:微信小程序开发全案精讲
上QQ阅读APP看书,第一时间看更新

1.5 微信小程序视图层

视频课程

微信小程序视图层

微信小程序框架的视图层用WXML 和WXSS 编写,由组件来进行展示。将逻辑层的数据在视图层中进行渲染,同时将视图层的事件发送给逻辑层。WXML(WeiXin Markup Language)用于描述页面的结构,WXSS(WeiXin Style Sheet)用于描述页面的样式,组件(Component)是视图的基本组成单元。

1.5.1 绑定数据

WXML页面中的动态数据都是来自.js文件Page下的data。数据绑定就是通过双大括号({{}})将变量包起来,在WXML页面中将数据值显示出来。

示例代码如下:

    index.wxml
    <view> {{ message }} </view>

    index..js
    Page({
      data: {
        message: 'Hello MINA!'
      }
    })

1.组件属性绑定

组件属性绑定是将data中的数据绑定到微信小程序的组件上,示例代码如下:

    <view id="item-{{id}}"> </view>
    Page({
      data: {
        id: 0
      }
    })

2.控制属性绑定

控制属性绑定是用来进行if语句条件判断,如果满足条件,则执行,否则不执行,示例代码如下:

    <view wx:if="{{condition}}"> </view>
    Page({
      data: {
        condition: true
      }
    })

3.关键字绑定

关键字绑定常用于组件的一些关键字。像复选框组件,checked关键字如果等于true,则代表复选框选中,false代表不选中复选框,示例代码如下:

    <checkbox checked="{{false}}"> </checkbox>

不要直接写成checked="false",否则其计算结果是一个字符串,转成boolean 类型后代表真值。

4.运算

在{{}} 内可以进行简单的运算,主要支持以下几种方式的运算。

1 三元运算

    <view hidden="{{flag ? true : false}}"> Hidden </view>

2 数学运算

    <view> {{a + b}} + {{c}} + d </view>
    Page({
      data: {
        a: 1,
        b: 2,
        c: 3
      }
    })

view中的显示内容为3+3+d。

3 逻辑判断

    <view wx:if="{{length > 5}}"> </view>

4 字符串运算

    <view>{{"hello" + name}}</view>
    Page({
      data:{
        name: 'MINA'
      }
    })

5 数据路径运算

    <view>{{object.key}} {{array[0]}}</view>
    Page({
      data: {
        object: {
          key: 'Hello'
        },
        array: ['MINA']
      }
    })

1.5.2 条件渲染

1.wx:if 判断单个组件

在微信小程序框架中,使用wx:if=”{{condition}}”来判断是否需要渲染该代码块,示例代码如下:

    <view wx:if="{{condition}}"> True </view>

使用wx:elif 和wx:else 来添加一个else 块,示例代码如下:

    <view wx:if="{{length > 5}}"> 1 </view>
    <view wx:elif="{{length > 2}}"> 2 </view>
    <view wx:else> 3 </view>

2.block wx:if 判断多个组件

wx:if 是一个控制属性,需要将它添加到一个标签上。如果想一次性判断多个组件标签,可以使用<block> </block> 标签将多个组件包起来,并在<block>中使用wx:if 控制属性,示例代码如下:

    <block wx:if="{{true}}">
      <view> view1 </view>
      <view> view2 </view>
    </block>

<block></block> 并不是一个组件,其仅仅是一个包装元素,不会在页面中做任何渲染,只接受控制属性。

1.5.3 列表渲染

1.wx:for 列表渲染单个组件

在组件上使用wx:for控制属性绑定一个数组,即可使用数组中各项的数据重复渲染该组件。默认数组当前项的下标变量名为index,数组当前项的变量名为item,示例代码如下:

    <view wx:for="{{array}}">
      {{index}}: {{item.message}}
    </view>
    Page({
      data: {
        array: [{
          message: 'foo',
        }, {
          message: 'bar'
        }]
      }
    })

使用wx:for-item 可以指定数组当前元素的变量名,使用wx:for-index 可以指定数组当前项下标的变量名,示例代码如下:

    <view wx:for="{{array}}" wx:for-index="idx" wx:for-item="itemName">
      {{idx}}: {{itemName.message}}
    </view>

2.block wx:for 列表渲染多个组件

如果想渲染一个包含多节点的结构块,这时wx:for需要应用在<block>标签上,示例代码如下:

    <block wx:for="{{[1, 2, 3]}}">
      <view> {{index}}: </view>
      <view> {{item}} </view>
    </block>

3.wx:key 指定唯一标识符

如果列表中项目的位置会动态改变或有新的项目添加到列表中,并且希望列表中的项目保持自己的特征和状态(如<input/> 中的输入内容,<switch/> 的选中状态),需要使用wx:key 来指定列表中项目的唯一标识符。

wx:key 的值可以两种形式表示。

1 字符串:代表在for循环的array中item的某个属性,该属性的值需要是列表中唯一的字符串或数字,且不能动态改变。

2 保留关键字:*this 代表在for循环中的item本身,这种表示需要item本身是唯一的字符串或数字。当数据改变触发渲染层重新渲染的时候,会校正带有关键字的组件,框架会确保它们被重新排序,而不是重新创建,以确保使组件保持自身的状态,并且提高列表渲染时的效率。

示例代码如下:

    <switch wx:for="{{objectArray}}" wx:key="unique" style="display: block; "> {{item.id}} </switch>
    Page({
      data: {
        objectArray: [
          {id: 5, unique: 'unique_5'},
          {id: 4, unique: 'unique_4'},
          {id: 3, unique: 'unique_3'},
          {id: 2, unique: 'unique_2'},
          {id: 1, unique: 'unique_1'},
          {id: 0, unique: 'unique_0'},
        ]
      }
    }

注意:若不提供wx:key,会提示警告。如果明确知道该列表是静态,或者不必关注其顺序,可以选择忽略。

1.5.4 定义模板

WXML提供模板(template)功能,允许将一些共用的、复用的代码在模板中定义成代码片段,然后在不同的地方调用,以达到一次编写,多次直接使用的效果。

1 定义模板

在<template/>内定义代码片段,使用name属性指定模板的名称,示例代码如下:

    <template name="msgItem">
      <view>
        <text> {{index}}: {{msg}} </text>
        <text> Time: {{time}} </text>
      </view>
    </template>

2 使用模板

在WXML文件中,使用is属性声明需要使用的模板,然后将模板所需要的data传入,示例代码如下:

    <template is="msgItem" data="{{item}}"/>
    Page({
      data: {
        item: {
          index: 0,
          msg: 'this is a template',
          time: '2016-09-15'
        }
      }
    })

is属性可以使用三元运算语法来动态决定具体需要渲染哪个模板,示例代码如下:

    <template name="odd">
      <view> odd </view>
    </template>
    <template name="even">
      <view> even </view>
    </template>

    <block wx:for="{{[1, 2, 3, 4, 5]}}">
        <template is="{{item % 2 == 0 ? 'even' : 'odd'}}"/>
    </block>

1.5.5 引用功能

WXML提供import引用和include引用两种文件引用方式。两者的区别在于:import引用模板文件,include引用整个文件(除了<template/>)。

1.import引用

import可以在当前文件中引用目标文件定义的模板。

假如在item.wxml 中定义一个叫item的模板,示例代码如下:

    <! -- item.wxml -->
    <template name="item">
      <text>{{text}}</text>
    </template>

在index.wxml 中引用item.wxml,就可以使用item模板,示例代码如下:

    <import src="item.wxml"/>
    <template is="item" data="{{text: 'forbar'}}"/>

2.include引用

include可以将目标文件(除了<template/>)的整个代码引入,相当于是复制到include位置,示例代码如下:

    <! -- index.wxml -->
    <include src="header.wxml"/>
    <view> body </view>
    <include src="footer.wxml"/>
    <! -- header.wxml -->
    <view> header </view>
    <! -- footer.wxml -->
    <view> footer </view>