微信小程序开发教程(八)视图层——.wxml详解

  框架的视图层由WXMKL(WeiXin Markup language)与WXSS(WeiXin Style Sheet)编写,由组件进行展示。

  对于微信小程序而言,视图层就是所有.wxml文件与.wxss文件的集合。

  微信小程序在逻辑层将数据进行处理后发送给视图层展现出来,同时接受视图层的事件反馈。

  ? .wxml文件用于描述页面的结构。

  ? .wxss文件用于描述页面的样式。

  视图层以给定的样式展现数据并将时间反馈给逻辑层,而数据展现是以组件来进行的。组件(Component)是视图的基本单元,是构建.wxml文件必不可少的。

  对于小程序的WXML编码开发,我们基本上可以认为就是使用组件、结合时间系统,构建页面结构的过程。.wxml文件中所绑定的数据,均来自于对应页的.js文件中Page方法的data对象。

WXML

  WXML是框架设计的一套类似HTML的标签语言,结合基础组件、事件系统,可以构建出页面的结构,即.wxml文件。

  .wxml文件第一行建议写<!--页面名.wxml-->。如:

<!--logs.wxml-->
<view class="container log-list">
    <block wx:for="{{logs}}" wx:for-item="log">
        <text class="log-item">{{index+1}}.{{log}}</text>
    </block>
</view>

  通过<view>组件控制页面内容展现,通过<block>组件与<text>组件实现页面数据绑定。

  WXML具有数据绑定、列表渲染、条件渲染、模板及事件绑定的能力。

  数据绑定

  .wxml文件中的动态数据均来自对应页面的.js文件中Page的data对象。

  (1)简单绑定

  数据绑定使用Mustache语法(即“双大括号”语法)将变量包起来。

  a.作用于内容

<!--wxml-->
<view>{{message}}</view>
//page.js
Page({
   date:{
        message:‘Hello MINA!‘
   }
})

  b.作用于组件属性

<!--wxml-->
<view id="item-{{id}}"></view>
//page.js
Page({
    data:{
        id:0
    }
})

  c.控制属性

<!--wxml-->
<view wx:if="{{condition}}"></view>
//page.js
Page({
    data:{
        condition:true
    }
})

  (2)运算

  可以在{{}}内进行简单的运算,支持以下几种方式:①三元运算,②算数运算,③逻辑判断,④字符串运算,⑤数据路径运算

<!--wxml-->
<!--①-->
<view hidden="{{flag ? true : false}}">Hidden</view>

<!--②-->
<view>{{a + b}} + {{c}} + d </view>
//page.js
Page({
    data:{
        a:1,
        b:2,
        c:3
    }
})

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

<!--④-->
<view>{{"hello" + name}}</view>
//page.js
Page({
    data:{
        name:‘MINA‘
    }
})

<!--⑤-->
<view>{{object.key}}{{array[0]}}</view>
//page.js
Page({
   data:{
       object:{
           key:‘Hello‘
       },
      array:[‘MINA‘]
   }
})

  (3)组合

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

数组:

<!--wxml-->
<view wx:for="{{zero,1,2,3,4}}">{{item}}</view>
//page.js
Page({
    data:{
        zero:0
    }
})

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

  对象:

<!--wxml-->
<template is="objectCombine" data="{{for:a,bar:b}}"></template>
//page.js
Page({
    data:{
        a:1,
        b:2
    }
})

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

  列表渲染

  列表语句可用于.wxml中进行列表渲染,将列表中的各项数据进行重复渲染。

  (1)wx:for

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

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

<!--wxml-->
<view wx:for="{{items}}">  {{index}}:{{item.message}}</view>
//page.js
Page({
   data:{
       items:[{      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>

  wx:for也可以嵌套,例如九九乘法表:

<view wx:for="{{[1,2,3,4,5,6,7,8,9]}}" wx:for-item="i">
    <view wx:for="{{[1,2,3,4,5,6,7,8,9]}}" wx:for-item="j">
        <view wx:if="{{i<=j}}">
            {{i}} * {{j}} = {{i*j}}
        </view>
    </view>
</view>    

  条件渲染

  条件语句可用于.wxml中进行条件渲染,不同的条件进行不同的渲染。

  我们用wx:if=“{{condition}}”来判断是否需要渲染该代码块。也可以用wx:elif和wx:else来添加一个else块。

<!--wxml-->
<view wx:if="{{view == ‘WEBVIEW‘}}">WEBVIEW</view>
<view wx:elif="{{view == ‘APP‘}}">APP</view>
<view wx:else="{{view == ‘MINA‘}}">MINA</view>
//page.js
Page({
    data:{
        view:‘MINA‘
    }
})    

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

<block wx:if="{{true}}">
    <view> view1 </view>
    <view> view2 </view>
</block>
注:<block/>并不是一个组件,他仅仅是一个包装元素,不会在页面中做任何渲染,只接受控制属性。

  

  wx:if 和 hidden的区别:

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

  同时wx:if也是惰性的,如果在初始渲染条件为false,框架什么也不做,在条件第一次变成真的时候才开始局部渲染。相比之下,hidden就简单的多,组件始终会被渲染,只需简单地控制显示与隐藏。

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

  模板

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

  使用name属性,作为模板的名字。使用is属性,声明需要使用的模板,然后将模板所需要的data传入。

<!--wxml-->
<template name="staffName">
    <view>
        FirstName:{{firstName}},LastName:{{lastName}}
    </view>
</template>

<template is="staffName" data="{{...staffA}}"></template>
<template is="staffName" data="{{...staffB}}"></template>
<template is="staffName" data="{{...staffC}}"></template>
//page.js
Page({
   date:{
       staffA:{firstName:‘Hulk‘,lastName:‘Hu‘},
       staffB:{firstName:‘Shang‘,lastName:‘You‘},
       staffC:{firstName:‘Gideon‘,lastName:‘Lin‘},
   }
})

  字例代码中,“...”为扩展运算符,用来展开一个对象,如staffA对象。

  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>

  模板拥有自己的作用域,只能使用data传入的数据。

  事件绑定

  事件的定义如下:

  ? 事件是视图层到逻辑层的通信方式。

  ? 事件可以将用户的行为反馈到逻辑层进行处理。

  ? 事件可以绑定在组件上,当达到触发事件,就会执行逻辑层中对应的事件处理函数。

  ? 事件对象可以携带额外信息,如id、dataset、touches。

  我们小程序与用户交互,多数情况下是通过事件来进行的。首先,在组件中绑定一个事件处理函数。在下面代码中,我们使用bindtap,当用户点击该组件view时会在该页面对应Page中找到相应的事件处理函数add。

<!--wxml-->
<!--指定view组件的唯一标识tapTest;自定义属性hi,其值为MINA;绑定事件add-->
<view id="tapTest" data-hi="MINA" bindtap="add">{{count}}</view>
注:应将bindtap理解为:bind+tap,即绑定冒泡事件tap(手指触摸后离开)。

  其次,在相应的Page定义中写上相应的事件处理函数。

//page.js
Page({
    data:{
        count:1
    },
    add:function(e){
        this.setData({
            count:this.data.count + 1
        })
    }
})

  事件详解

  微信小程序里的事件分为冒泡事件和非冒泡事件:

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

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

  WXML中的冒泡事件仅有6个

  除上表之外的其他组件自定义时间都是非冒泡事件。

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

  ? key以bind或touch开头,然后跟上事件的类型,如bindtap、catchtouchstart。

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

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

  看一个例子:

<view id="outter" bindtap="handleTap1">
    outer view
    <view id="middle" catchtap="handleTap2">
        middle view
        <view id="inner" catchtap="handleTap3">
            inner view
        </view>
    </view>
</view>

  点击id为inner的组件会先后触发handleTap3和handleTap2,不会触发handleTap1。

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

  BaseEvent 基础事件对象属性列表:

  

  CustomEvent 自定义事件对象属性列表(继承 BaseEvent):

  

  TouchEvent 触摸事件对象属性列表(继承 BaseEvent):

  

  特殊事件: <canvas/> 中的触摸事件不可冒泡,所以没有 currentTarget。

  ? type:通用事件类型。

  ? timeStamp:页面打开到触发事件所经过的毫秒数

  ? target:触发事件的源组件。是一个对象,具有以下三个属性:

  

  ? currentTarget:事件绑定的当前组件。与target类似,是一个对象,同样具有上表三个属性。

  ? touches:触摸点数组,每个触摸点包含以下属性。

  

  ? changedTouches:数据格式同touches。表示有变化的触摸点。

  ? detail:指特殊事件所携带的数据。如表单组件的提交事件会携带用户的输入,媒体的错误事件会携带错误信息。

  引用

  WXML提供两种文件引入方式:import和include。

  (1)import

  import可以在该文件中使用目标文件定义的template,例如:在item.wxml中定义了一个叫item的template:

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

  在index.wxml中引用了item.wxml,就可以使用item模板:

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

  import有作用域,只会引用目标文件中定义的template,而不会引用目标文件嵌套import的template。

  (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>
时间: 2024-12-17 10:18:18

微信小程序开发教程(八)视图层——.wxml详解的相关文章

微信小程序开发教程目录

本系列教程是自己在工作中使用到而记录的,没有顺序之分 如有错误之处,请给与指正,也不希望误导了别人 微信小程序开发教程目录 微信小程序之注册和入门 微信小程序之HTTPS请求 微信小程序开发之选项卡 微信小程序开发之picker 微信小程序开发之图片预览 微信小程序开发之模板 微信小程序开发之模板消息

微信小程序开发教程集合

微信小程序开发教程集合?不少朋友都知道现在是小程序发展如火如荼的时候,甚至不少朋友都准备进入小程序开发这个领域.但是互联网上各种信息浩如烟海,如何在这些繁杂的信息中找到自己所需要的,这对于不少人来说是个问题,来现在多享科技为你详细讲述一下微信小程序开发教程,希望可以帮助小程序开发者节约一些时间. 微信小程序开发教程官方文档 作为小程序开发这一领域的开创者以及裁判员,微信官方对于小程序是寄予厚望,微信小程序的版本更迭非常迅速.小程序开发者必须重视微信官方文档教程 小程序开发文档:developer

微信小程序开发:学习笔记[2]——WXML模板

微信小程序开发:学习笔记[2]--WXML模板 快速开始 介绍 WXML 全称是 WeiXin Markup Language,是小程序框架设计的一套标签语言,结合小程序的基础组件.事件系统,可以构建出页面的结构. 打开开发工具的编辑器,在根目录下找到 app.json 文件,双击打开,在 "pages/index/index" 上新增一行 "pages/wxml/index" 保存文件.模拟器刷新后,读者可以在编辑器中找到 pages/wxml/index.wxm

微信小程序开发教程,大多数人都搞错的八个问题

小程序目前被炒得沸沸扬扬,无数媒体和企业借机获取阅读流量. 这再次证明一点,微信想让什么火,真的就能让什么火.这种能力真是全中国再也没有人有了,政府也没有. 但四处传的消息很多是失真的,废话不说,先列出8个多数人都搞错的问题: 小程序是HTML5: 小程序是B/S的: 把M站改改就可以接入到小程序里: 小程序体验不佳: 小程序适合低频长尾应用: 小程序是新的Appstore: 小程序做不起来,需求不高: 小程序会做起来,但会和原生应用长期并存. 以上8个是很多人凭直觉得出的结论,但真正深度调研和

微信小程序开发教程(九)视图层——.wxss详解

WXSS是一套样式语言,用于描述WXML的组件样式. 官方文档表示,WXSS的选择器目前支持(".class"."#id"."elemnt"."element,element"."::after"."::before"),而且本地资源无法通过WXSS获取,所以WXSS中的样式都是用的网络图片,或者base64. 好在微信团队提供的WXSS具有CSS大部分特性.同时为了更适合开发微信小程序

【helloworld】-微信小程序开发教程-入门篇【4】

1. 开篇导言 本节目标:通过上一节的讲解,相信大家对小程序框架MINA的目录结构和配置有了一定的了解.接下来将会讲解视图层,逻辑层及其之间的交互. 目标用户:无编程经验,但对微信小程序感兴趣的同学. 学习目标:了解MINA框架的视图层(View),逻辑层(App Service),及其之间的交互. 案例分析:helloworld小程序. 代码下载 传送门: 目录:微信小程序教程-开篇导言-很快微信小程序社区上一篇:[helloworld]-微信小程序教程-入门篇[3]    下一篇:未开启.

helloworld】-微信小程序开发教程-入门篇【2】

1. 开篇导言 本节目标:通过上一节的讲解,相信大家对微信小程序有了初步的了解.接下来将会对小程序的框架进行简单介绍. 目标用户:无编程经验,但对微信小程序感兴趣的同学. 学习目标:了解MINA框架的基本特征,并对数据绑定和页面(Page)有概念上的认识. 案例分析:对于helloworld小程序的进行讲解. 代码下载 传送门: 目录:微信小程序教程-开篇导言-很快微信小程序社区上一篇:[helloworld]-微信小程序教程-入门篇[1]-很快微信小程序社区下一篇:[helloworld]-微

微信小程序开发教程

9月21日晚发布的微信公众平台·小程序内侧邀请,微信应用号(小程序,「应用号」的新称呼)终于来了!目前还处于内测阶段,微信只邀请了部分企业参与封测.想必大家都关心应用号的最终形态到底是什么样子? 怎样将一个「服务号」改造成为「小程序」?相信很多技术人员开始关注,会不会取代APP开发,一些职位会不会被取代. 现在带你一步步创建完成一个微信小程序,并可以在手机上体验该小程序的实际效果.这个小程序的首页将会显示欢迎语以及当前用户的微信头像,点击头像,可以在新开的页面中查看当前小程序的启动日志.下载源码

【helloworld】-微信小程序开发教程-入门篇【3】

1. 开篇导言 本节目标:通过上一节的讲解,相信大家对小程序框架MINA有了初步了解.接下来将会对其进行深入介绍. 目标用户:无编程经验,但对微信小程序感兴趣的同学. 学习目标:了解MINA框架的目录结构和配置. 案例分析:helloworld小程序. 代码下载 传送门: 目录:微信小程序教程-开篇导言-很快微信小程序社区上一篇:[helloworld]-微信小程序教程-入门篇[2]-很快微信小程序社区    下一篇:[helloworld]-微信小程序教程-入门篇[4]-很快微信小程序社区.