美文网首页微信小程序开发入门
微信小程序开发入门:2.4 视图层(View),2.4.1 WX

微信小程序开发入门:2.4 视图层(View),2.4.1 WX

作者: wangbu2 | 来源:发表于2018-04-20 13:28 被阅读0次

    框架的视图层由 WXML 与 WXSS 编写,由组件来进行展示。

    将逻辑层的数据反应成视图,同时将视图层的事件发送给逻辑层。

    WXML(WeiXin Markup language) 用于描述页面的结构。

    WXS(WeiXin Script) 是小程序的一套脚本语言,结合 WXML,可以构建出页面的结构。

    WXSS(WeiXin Style Sheet) 用于描述页面的样式。

    组件(Component)是视图的基本组成单元。

    2.4.1 WXML

    WXML(WeiXin Markup Language)是框架设计的一套标签语言,结合基础组件、事件系统,可以构建出页面的结构。

    WXML 具有以下能力:

    1. 数据绑定
    2. 列表渲染
    3. 条件渲染
    4. 模板
    5. 事件

    2.4.1.1 数据绑定

    WXML 中的动态数据均来自对应 Page 的 data。

    2.4.1.1.1 简单绑定

    数据绑定使用 Mustache 语法(双大括号)将变量包起来,可以作用于:

    1、内容

    <view> {{ message }} </view>
    
    Page({
      data: {
        message: 'Hello MINA!'
      }
    })
    

    2、组件属性(需要在双引号之内)

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

    3、控制属性(需要在双引号之内)

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

    4、关键字(需要在双引号之内)

    true:boolean 类型的 true,代表真值。

    false: boolean 类型的 false,代表假值。

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

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

    2.4.1.1.2 运算

    可以在 {{ }} 内进行简单的运算,支持的有如下几种方式:

    1、三元运算

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

    2、算数运算

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

    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']
      }
    })
    

    2.4.1.1.3 组合

    也可以在 Mustache 内直接进行组合,构成新的对象或者数组。

    1、数组

    <view wx:for="{{[zero, 1, 2, 3, 4]}}"> {{item}} </view>
    
    Page({
      data: {
        zero: 0
      }
    })
    

    最终组合成数组[0, 1, 2, 3, 4]。

    2、对象

    <template is="objectCombine" data="{{for: a, bar: b}}"></template>
    
    Page({
      data: {
        a: 1,
        b: 2
      }
    })
    

    最终组合成的对象是 {for: 1, bar: 2}

    注意: 花括号和引号之间如果有空格,将最终被解析成为字符串

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

    等同于

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

    2.4.1.2 列表渲染

    1、wx:for

    在组件上使用 wx:for 控制属性绑定一个数组,即可使用数组中各项的数据重复渲染该组件。

    默认数组的当前项的下标变量名默认为 index,数组当前项的变量名默认为 item

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

    2、block wx:for

    类似 block wx:if,也可以将 wx:for 用在<block/>标签上,以渲染一个包含多节点的结构块。例如:

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

    3、wx:key

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

    2.4.1.3 条件渲染

    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/> 标签将多个组件包装起来,并在上边使用 wx:if 控制属性。

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

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

    3、wx:if vs hidden

    因为 wx:if 之中的模板也可能包含数据绑定,所有当 wx:if 的条件值切换时,框架有一个局部渲染的过程,因为它会确保条件块在切换时销毁或重新渲染。

    同时 wx:if 也是惰性的,如果在初始渲染条件为 false,框架什么也不做,在条件第一次变成真的时候才开始局部渲染。

    相比之下,hidden 就简单的多,组件始终会被渲染,只是简单的控制显示与隐藏。

    一般来说,wx:if 有更高的切换消耗而 hidden 有更高的初始渲染消耗。因此,如果需要频繁切换的情景下,用 hidden 更好,如果在运行时条件不大可能改变则 wx:if 较好。

    2.4.1.4 模板

    WXML提供模板(template),可以在模板中定义代码片段,然后在不同的地方调用。

    1、定义模板

    使用 name 属性,作为模板的名字。然后在<template/>内定义代码片段,如:

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

    2、使用模板

    使用 is 属性,声明需要的使用的模板,然后将模板所需要的 data 传入,如:

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

    is 属性可以使用 Mustache 语法,来动态决定具体需要渲染哪个模板:

    <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>
    

    3、模板的作用域

    模板拥有自己的作用域,只能使用 data 传入的数据以及模板定义文件中定义的 <wxs /> 模块。

    2.4.1.5 事件

    2.4.1.5.1 什么是事件

    • 事件是视图层到逻辑层的通讯方式。
    • 事件可以将用户的行为反馈到逻辑层进行处理。
    • 事件可以绑定在组件上,当达到触发事件,就会执行逻辑层中对应的事件处理函数。
    • 事件对象可以携带额外信息,如 id, dataset, touches。

    2.4.1.5.2 事件的使用方式

    1、在组件中绑定一个事件处理函数

    bindtap ,当用户点击该组件的时候会在该页面对应的Page中找到相应的事件处理函数。

    <view id="tapTest" data-hi="WeChat" bindtap="tapName"> Click me! </view>
    

    2、在相应的Page 定义中写上相应的事件处理函数,参数是event。

    Page({
      tapName: function(event) {
        console.log(event)
      }
    })
    

    3、可以看到log 出来的信息。

    2.4.1.5.3 事件详解

    1、事件分类

    事件分为冒泡事件和非冒泡事件:

    • 冒泡事件:当一个组件上的事件被触发后,该事件会向父节点传递。
    • 非冒泡事件:当一个组件上的事件被触发后,该事件不会向父节点传递。

    2、事件绑定和冒泡

    事件绑定的写法同组件的属性,以 key、value 的形式。

    1. key 以bind或catch开头,然后跟上事件的类型,如bindtap、catchtouchstart。自基础库版本 1.5.0起,bind和catch后可以紧跟一个冒号,其含义不变,如bind:tap、、catch:touchstart。

    2. value 是一个字符串,需要在对应的 Page 中定义同名的函数。不然当触发事件的时候会报错。

    bind事件绑定不会阻止冒泡事件向上冒泡,catch事件绑定可以阻止冒泡事件向上冒泡。

    3、事件的捕获阶段

    自基础库版本 1.5.0 起,触摸类事件支持捕获阶段。捕获阶段位于冒泡阶段之前,且在捕获阶段中,事件到达节点的顺序与冒泡阶段恰好相反。需要在捕获阶段监听事件时,可以采用capture-bind、capture-catch关键字,后者将中断捕获阶段和取消冒泡阶段。

    4、事件对象

    如无特殊说明,当组件触发事件时,逻辑层绑定该事件的处理函数会收到一个事件对象。

    2.4.1.6 引用

    WXML 提供两种文件引用方式 importinclude

    1、import

    import 可以在该文件中使用目标文件定义的 template,如:

    在 item.wxml 中定义了一个叫 itemtemplate

    <!-- 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、import 的作用域

    import 有作用域的概念,即只会 import 目标文件中定义的 template,而不会 import 目标文件 import 的 template。

    3、include

    include 可以将目标文件除了 <template/> <wxs/> 外的整个代码引入,相当于是拷贝到 include 位置。


    参考资料:https://developers.weixin.qq.com/miniprogram/dev/framework/view/wxml/

    相关文章

      网友评论

        本文标题:微信小程序开发入门:2.4 视图层(View),2.4.1 WX

        本文链接:https://www.haomeiwen.com/subject/fnbakftx.html