02小程序的WXML 和 事件

WXML语法概述:

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

微信官方教程如下:https://developers.weixin.qq.com/miniprogram/dev/framework/view/wxml/

特点:

  1. 布局的方式跟HTML是一模一样的。
  2. 标签的名字不再是传统的HTML的了,而是使用微信自己定义的一套,所以写代码的时候完全使用之前写HTML的方式去写,只不过改个标签名就可以了。
  3. WXML的语法,和一些模板语法比如Django中的模板语法非常的类似。

WXML数据绑定:

WXML 中的动态数据均来自对应 Page 的 data。 (wxml 可以使用 js 中 Page() 函数的 data 中的数据  )

我们的数据都是放在 js 中,从 Js中渲染到 wxml 中,就是通过数据绑定将 js 中的数据 渲染到 wxml 中。   

例如:我们在 js中 如下定义数据:

02小程序的WXML 和  事件

 

那么使用的时候就可以直接在 wxml 中使用,不过使用的语法是 使用双括号的方法!!!  如下:

02小程序的WXML 和  事件

也可以在 把对象 渲染到  wxml 中,

例如:

02小程序的WXML 和  事件

 

使用的时候:

02小程序的WXML 和  事件

 

 

也可以在 把数组   渲染到  wxml 中,可以通过下标进行操作:

02小程序的WXML 和  事件

 

 

02小程序的WXML 和  事件

 

可以在 花括号  中进行一些简单的运算(判断  和 四则运算  ):

02小程序的WXML 和  事件

 

02小程序的WXML 和  事件

 

注意:在标签的属性中的时候 双括号外要加上  双引号!!!   

02小程序的WXML 和  事件   所以,只有 放在双括号里面的才是作为数据来解析,    

 

 

 

关于 变量渲染 的总结  :

  1. 使用双大花括号。
  2. 获取对象的值,通过下标获取数组中的值。
  3. 可以做运算,比如判断,四则运算等。
  4. 总而言之一句话:需要使用js中传过来的值,就必须使用双大花括号

WXML条件渲染  :

当前标签 在满足一定的条件下才会被渲染,这就是条件渲染!  

wx:if

在框架中,使用 wx:if="" 来判断是否需要渲染该代码块:

02小程序的WXML 和  事件

block wx:if

使用block 可以做到当满足一个条件的时候可以渲染多个标签,

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

02小程序的WXML 和  事件

 

 

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

 

还有需要注意的是:在 条件判断标签 中间 不能有其它不相关的标签,

例如如下就会报错:

02小程序的WXML 和  事件

 

WXML列表渲染(循环一个列表 )  :

wxml 中循环列表的基本方法:

通过语法wx:for="{{列表}}"来渲染一个列表

我们可以使用 item 变量 来遍历   列表中的数据,

我们可以使用 index 变量 来遍历   列表中的数据,

02小程序的WXML 和  事件

 

渲染之后的结果是:  

02小程序的WXML 和  事件

 

 

 

默认的变量 是  item 和 index ,也可以自己定义:

循环中,默认的下标名称是index,默认的值的名称是item。如果想要修改循环列表的值和下标的名称,那么可以通过wx:for-index和wx:for-item来指定。示例代码如下:
02小程序的WXML 和  事件

 

此时就可以使用 value  变量 和 idx 变量了,   

循环中渲染多个标签:  

如果想要在循环中渲染多个标签,那么也可以通过block来实现。示例代码如下:
02小程序的WXML 和  事件

 

02小程序的WXML 和  事件

 

 

99乘法表例子 :

02小程序的WXML 和  事件

 

02小程序的WXML 和  事件

 

02小程序的WXML 和  事件

 

 

此时的数据就准备好了, 然后再通过 wxss 来将数据渲染 之后即可,  

 

 

 

02小程序的WXML 和  事件

02小程序的WXML 和  事件

 

此时效果如下: 

02小程序的WXML 和  事件

 

 

总结:

02小程序的WXML 和  事件

 

02小程序的WXML 和  事件

 

效果如下: 

02小程序的WXML 和  事件

WXML列表渲染 之 wx:key  :

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

wx:key 的值以两种形式提供:

1,字符串或者数字,代表在 for 循环的 array 中 item 的某个 property,该 property 的值需要是列表中唯一的字符串或数字,且不能动态改变。在写的时候,直接写这个 property 的名字就可以了,不需要写item.property的形式,并且不需要加中括号
2,保留关键字 *this 代表在 for 循环中的 item 本身,这种表示需要 item 本身是一个唯一的字符串或者数字,如:
当数据改变触发渲染层重新渲染的时候,会校正带有 key 的组件,*框架会确保他们被重新排序,而不是重新创建,以确保使组件保持自身的状态,并且提高列表渲染时的效率。

及时列表中的组件没有发生状态改变,那么也建议使用wx:key。因为如果不使用,那么以后重新渲染的时候,就会把之前组件销毁掉,然后重新创建,性能会很低。

如不提供 wx:key,会报一个 warning, 如果明确知道该列表是静态,或者不必关注其顺序,可以选择忽略。

 

一句话,提供wx:key 就不会重新创建,不提供要重新创建,所以渲染列表时一定要提供wx:key   

 

补充:js中的splice () 方法:

arrayObject.splice(index,howmany,item1,.....,itemX)
参数 描述
index 必需。整数,规定添加/删除项目的位置,使用负数可从数组结尾处规定位置。
howmany 必需。要删除的项目数量。如果设置为 0,则不会删除项目。
item1, ..., itemX 可选。向数组添加的新项目。

 

02小程序的WXML 和  事件上述代码就是在索引0 处加入一个‘a‘,   

 

js 中  push() 向数组后面加一个,  unshift() 向数组第一个加一个,  

补充:  

02小程序的WXML 和  事件

 

 

当数据发生改变,我们可以使用 this.setData()将数据设置回去,  

02小程序的WXML 和  事件

 

 

 

wx: key 的使用:

02小程序的WXML 和  事件

 

 

此时假设 已经打开了swith1  ,

02小程序的WXML 和  事件

 

 

 然后  点击 增加一个sitch  此时如下:(选中状态的 switch  变为了 switch5,此时就是有问题的)

02小程序的WXML 和  事件

 

 

 

wx:key 解决方法:  

02小程序的WXML 和  事件

 

 

02小程序的WXML 和  事件

 

 

总而言之,wx:key 需要一个固定的唯一的值在这,  而且不需要 item.    也不需要写 双括号,直接写 属性名字即可!!!     

 

用item 本身做为wx:key 

有的时候,item 本身就是一个唯一的字符串或数字,可以直接做为wx:key ,此时可以使用item 本身,但是不可以直接使用,应该用 *this 代表!!!  

例如:

02小程序的WXML 和  事件

02小程序的WXML 和  事件

 

 

此时 wx:key 是不行的,不能使用 item 来,应该使用*this  来代替,  

02小程序的WXML 和  事件

 

 

这样就可以了,  

 

其实,就算是我们的数据没有发生更新,我们也要 提供一个wx:key 来提高性能,

 

WXML模板技术 :

有些时候,一段布局代码我们需要在多个地方使用,那么我们可以将其定义成模板,然后把变量单独抽取出来,通过调用模板的时候再传递过去。示例代码如下:

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

<import src="../../templates/msgItem.wxml" />
<template is="msgItem" data="{{index:1,msg:"你好!我是知了课堂!",time:3000年10月22日}}"/> 

 

创建模板:

02小程序的WXML 和  事件

 

02小程序的WXML 和  事件

 

02小程序的WXML 和  事件

 

 

 

现在的任务是  要 把 这两个 文件 .wxml 和 .wxss 做成模板,在其他地方直接使用,   

把.wxml 中的标签放到 template 标签中,

02小程序的WXML 和  事件

 

 

把要做为 模板的wxss 文件直接放到 里面,  

02小程序的WXML 和  事件

 

 

接下来,就可以直接 引用 刚刚弄好的模板了,   

使用模板之 wxml 使用模板 :

在别的wxml 文件中使用模板时候,首先要 import 下,  

02小程序的WXML 和  事件

 

import 之后,才可以使用模板,

使用模板:用is 

02小程序的WXML 和  事件

 

 

注:定义模板的时候,用name ,使用模板用is  

 

使用模板之 wxss 使用模板 :

wxss 在使用模板的时候,直接@import即可, 

02小程序的WXML 和  事件

 

 

但是上面的模板都是固定的,都是死的,下面看动态模板

动态模板 创建:

02小程序的WXML 和  事件

 

 

动态模板的使用: 

在使用动态模板的时候,使用 data进行传递数据,  

02小程序的WXML 和  事件

 

 

 

这就是模板的好处,太棒了!!! 

 

wxml 模板快捷传参:

代码如下:

02小程序的WXML 和  事件

 

02小程序的WXML 和  事件

 

效果如下:

02小程序的WXML 和  事件

 

 

 

对于上面的效果还可以 用如下更方便的方式实现: 

02小程序的WXML 和  事件

 

...item 代表的就是 和之前的一样,就是 moto:item.moto,author:item.author   

使用三个点的前提是:模板中使用的变量名字 刚好是  对象的key !!!  (一般是模板结合 循环   )

 

WXML 之 include 标签 :

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

如果一段代码是不需要填入动态的数据,那么可以直接使用include把这段代码引入到其他的地方。

就是相当于简单粗暴的 ctrl+ c  和 ctrl +v   

02小程序的WXML 和  事件

 

 

 

但是,注意:如果所引用的文件中有  template 标签, 是不可以被引用的,即模板不可以被引用。   

 

 

事件:

事件绑定:  

 

02小程序的WXML 和 事件

上一篇:03小程序的WXSS 和 flex 布局


下一篇:七 小程序判断大小端