2.2 应用程序的骨架——WXML基础
WXML,全称是WeiXin Markup Language,是专门在小程序中使用的一套标签语言。如果读者有开发网页的经验,那么很容易理解WXML。WXML中定义了一套完整的小程序基础组件标签,并且标签结合事件系统提供用户交互功能。在开发小程序页面时,第一步就是搭建页面结构,即编写WXML代码。
2.2.1 认识WXML
一个完整的WXML标签由开始标签和结束标签组成。在开始标签和结束标签之间可以编写标签的内容,也可以嵌套其他标签,以之前创建的HelloWorld小程序为例,其中index.wxml文件中的代码如下:
![](https://epubservercos.yuewen.com/DC4D25/16793576504227606/epubprivate/OEBPS/Images/49_1.jpg?sign=1739339606-M1DucgAL8aj3RolRBn0fkH1JYOSrcXfB-0-cc6c9f302f30e2fa16bda12f80050e47)
下面逐步解析上面的5行代码:<!--内容-->是WXML注释的写法,其中的内容并不会对程序产生任何影响,其作用只是帮助开发者阅读代码。index.wxml文件定义了3个组件,最外层使用view组件作为容器,并将其class属性设置为container,container实际上是WXSS样式表中定义的一个全局的容器样式。
在view容器内部,我们又嵌套了一个text组件和一个button组件。text组件用来显示文本,其中,style属性可以设置文本的颜色、字体、字号等属性;button组件用来渲染可以进行用户交互的按钮,其中,bindtap属性用来绑定按钮单击方法。
每种标签都可以拥有其独特的属性,属性的设置一般都是通过key="value"的方式在一组标签的开始标签中定义的。
2.2.2 将数据绑定到WXML界面中
小程序采用了响应式编程的设计思路,页面的展示是由数据进行驱动的,也就是说,如果数据产生变化,页面也会直接根据数据重新渲染。WXML提供了数据绑定的功能。
以HelloWorld程序为例,其中,文本标签显示的文本“HelloWorld”是写在text组件内部的,如果需要动态改变这个文本的值,那么需要将其定义在index.js文件中,并绑定到index.wxml的text组件中,先修改index.js文件中页面函数中data属性的值,示例代码如下:
![](https://epubservercos.yuewen.com/DC4D25/16793576504227606/epubprivate/OEBPS/Images/49_2.jpg?sign=1739339606-69WCmtmMpWZuWbvIE0BDSBRwLZ0Q0irQ-0-f75965ebb692e1d6ee71e02fdfebc061)
页面所需要的数据通常定义在data属性中,这个属性的更改可以直接触发页面的重绘。修改index.wxml文件中的代码,示例代码如下:
![](https://epubservercos.yuewen.com/DC4D25/16793576504227606/epubprivate/OEBPS/Images/49_3.jpg?sign=1739339606-XiFeOJS7QtGmLfVrqfFxzy9JxTEQ6afS-0-2f36072ba151ba325c3bf66a781b90e0)
刷新模拟器,效果如图2-2所示,可以看到text组件已经成功绑定了textData数据。
![](https://epubservercos.yuewen.com/DC4D25/16793576504227606/epubprivate/OEBPS/Images/50_1.jpg?sign=1739339606-BYI3LFDbX3bITJqWK4NjcerI1vy7zLiU-0-619184c8bbd3cbeee76d2fa9e307b03d)
图2-2 为组件动态绑定数据
“{{}}”属性绑定的基本语法,不只是标签的内容,标签的属性也可以动态进行绑定,上面示例代码中的文本颜色属性就是通过textColor数据动态设置的,需要注意的是,属性的数据在绑定时,应将其放入引号内。还有一个细节需要注意,若主要标签绑定的数据值为undefined,则标签是不会被渲染的,示例代码如下:
![](https://epubservercos.yuewen.com/DC4D25/16793576504227606/epubprivate/OEBPS/Images/50_2.jpg?sign=1739339606-iWEozAxYKmkkNUfgnqj4KAWQgJKQd5te-0-cece7798d02c2d2ae6648c145402cf9b)
2.2.3 WXML的逻辑能力
除可以直接绑定数据外,“{{}}”还拥有一些简单的逻辑能力,如使用运算符进行一些运算操作:
![](https://epubservercos.yuewen.com/DC4D25/16793576504227606/epubprivate/OEBPS/Images/50_3.jpg?sign=1739339606-jm27HQzOy6FyAMVpCklKnKADrKTkg4BR-0-af24abf07fb729a6bf75fae5d0adae8a)
运行代码,效果如图2-3所示。
![](https://epubservercos.yuewen.com/DC4D25/16793576504227606/epubprivate/OEBPS/Images/50_4.jpg?sign=1739339606-Vi7gNzIMtGlPeQtdw7OsnxfOfEKv9n4W-0-c67e09bacd8c855cb61a78fa1fac8162)
图2-3 标签绑定数据中添加运算逻辑
WXML也支持进行条件渲染,即当满足判定条件时,此标签才被渲染,通过为标签添加wx:if属性设置条件,示例代码如下:
![](https://epubservercos.yuewen.com/DC4D25/16793576504227606/epubprivate/OEBPS/Images/51_1.jpg?sign=1739339606-S1gOdfAsLdPZau2Z9FnKr9LhMXsbWHA1-0-177cbfc1134da19ba7b3b5614c8bdfed)
上面的示例代码将wx:if属性对应的值设置为false,刷新模拟器可以看到文本标签将不会被渲染,在通常情况下,wx:if属性绑定的数据是一个条件表达式,示例代码如下:
![](https://epubservercos.yuewen.com/DC4D25/16793576504227606/epubprivate/OEBPS/Images/51_2.jpg?sign=1739339606-boEaWh2IFTgydyy94qk1XnSQdGNP4SG9-0-357593122faa11eea81d7f853544d120)
wx:if属性也可以和wx:elif、wx:else结合使用,从而实现更复杂的条件渲染逻辑,示例代码如下:
![](https://epubservercos.yuewen.com/DC4D25/16793576504227606/epubprivate/OEBPS/Images/51_3.jpg?sign=1739339606-MM4XiF3V5qaJEgj94lAm0YiDa9v8IKZU-0-51dea12a997ebe79de0c23314704d2a7)
上面的代码会判定textData数据的长度,大于3个字符则在页面上显示textData数据拼接上“!一起来学习吧”,如果不大于3个字符但大于0个字符,则在页面显示textData的值,否则在页面显示“无数据”。
如果需要同时对多个标签进行条件渲染,则可以使用block标签进行包裹,然后控制block标签的渲染条件即可,示例代码如下:
![](https://epubservercos.yuewen.com/DC4D25/16793576504227606/epubprivate/OEBPS/Images/51_4.jpg?sign=1739339606-8DkBcpMupIqyqSTq6Q7ZFHx3LsHCjIqm-0-a0aa48ddf962cb0e9563b6c7d1132c2d)
在学习JavaScript的语法时,我们了解到,分支和循环是程序流程控制的两大逻辑。对于WXML的渲染也是一样,WXML也支持循环渲染标签,这是小程序简单列表的基本开发方式,使用wx:for实现对数组的遍历,并循环渲染标签内部内容,首先在页面数据源中定义一个数据,示例代码如下:
![](https://epubservercos.yuewen.com/DC4D25/16793576504227606/epubprivate/OEBPS/Images/51_5.jpg?sign=1739339606-0oQimmj0pSDKsM6Ih4Pzt1ZRyQTb8Mfi-0-3052601e80877c75f3843e8b3f74dbcb)
修改index.wxml文件,示例代码如下:
![](https://epubservercos.yuewen.com/DC4D25/16793576504227606/epubprivate/OEBPS/Images/51_6.jpg?sign=1739339606-Feuw3KBUVn50iWK8UswrT80yv1N05tzT-0-83b2611f2df495ee01ad3fddef148a9c)
wx:for属性会对数据进行遍历,并且自动生成两个临时变量:index和item。index为当前遍历数据元素的下标值,从0开始;item为当前遍历出的数据元素。运行上面的代码,效果如图2-4所示。
![](https://epubservercos.yuewen.com/DC4D25/16793576504227606/epubprivate/OEBPS/Images/52_3.jpg?sign=1739339606-FvRV2w0nq9qoBM0gzZw1jXyo5vBNSbHf-0-f88645ec8a3232fe9d46c525cf48ebe8)
图2-4 循环渲染
开发者也可以对数组遍历的临时变量名进行自定义:wx:for-index用来自定义下标变量名,wx:for-item用来自定义元素变量名。示例代码如下:
![](https://epubservercos.yuewen.com/DC4D25/16793576504227606/epubprivate/OEBPS/Images/52_1.jpg?sign=1739339606-XCKNKWVmj7y8Ei3KBYsldJ7G1oIGq9le-0-7769df25bb6a48f54e0d6f751dd048a4)
和wx:if的逻辑一样,如果要进行多个标签的循环渲染,可以使用block标签将需要循环的代码块进行包裹,示例代码如下:
![](https://epubservercos.yuewen.com/DC4D25/16793576504227606/epubprivate/OEBPS/Images/52_2.jpg?sign=1739339606-SOLr5sqHc6OepyXuRgNqmK2Ei1ioUe9Q-0-7eeecb0da3fd5384a7e0eb0d071fa8fb)
运行代码,效果如图2-5所示。
![](https://epubservercos.yuewen.com/DC4D25/16793576504227606/epubprivate/OEBPS/Images/52_4.jpg?sign=1739339606-nV3ke3VjLFbjUC0YZesNX1EuCzv2GFHT-0-beb348622dcddbdf3e2422be3e2cdfb7)
图2-5 组合标签循环渲染
2.2.4 WXML模板
对于组合复杂且复用性强的组件,可以将其定义为模板,在使用时直接使用模板即可,示例代码如下:
![](https://epubservercos.yuewen.com/DC4D25/16793576504227606/epubprivate/OEBPS/Images/52_5.jpg?sign=1739339606-JGAvbJkowzMoKTe63kxVxGwdBMe6HaFJ-0-8a37519413f121b1cf091202479d0589)
在上面的代码中,开始的template标签定义了一个模板,模板的名字为item,后面需要通过模板名指定要使用的模板,模板中可能会用到外面传递的一些数据,在使用模板时,通过设置data属性可以进行数据的传递,上面的示例代码演示了将遍历出的列表数据传递到模板内进行渲染。
上面的示例代码将模板定义在index.wxml文件中,但在实际开发中通常不会这样做,模板一般都是具有复用性的组件,为了便于复用,一般会将模板定义在单独的文件中,在需要使用时进行引用,首先在工程的根目录下创建一个新的文件夹,命名为template,如图2-6所示。
![](https://epubservercos.yuewen.com/DC4D25/16793576504227606/epubprivate/OEBPS/Images/53_2.jpg?sign=1739339606-VUqtrXUOeW6UWqFz3HAWoT23liek5AFX-0-4d6413ce16c4cc6a3b54f3ada1e492e2)
图2-6 新建模板文件夹
在template文件夹中新建一个WXML文件,命名为item.wxml,在其中编写如下代码:
![](https://epubservercos.yuewen.com/DC4D25/16793576504227606/epubprivate/OEBPS/Images/53_3.jpg?sign=1739339606-IVMp5PuuRmktE3OpedB0LomKFYa0EdAr-0-735b3a8cc7f346df37e29b74227c10ac)
修改index.wxml,示例代码如下:
![](https://epubservercos.yuewen.com/DC4D25/16793576504227606/epubprivate/OEBPS/Images/53_4.jpg?sign=1739339606-ozYTNJdPdVFghHJJti2qUYp5I7YhzEuu-0-05a4c2ada828653b0861abad7c1b847d)
import标签的作用是导入其他模板文件,在导入时需要注意路径的正确性,与之类似的还有include标签,include标签会将文件中除template标签和wxs标签外的所有内容直接复制到当前include的位置。例如,在工程根目录下新建一个命名为common的文件夹,用来存放公共组件,在其中新建一个命名为header.wxml的文件,编写的代码如下:
![](https://epubservercos.yuewen.com/DC4D25/16793576504227606/epubprivate/OEBPS/Images/54_1.jpg?sign=1739339606-19iebXOntAvVF3CLw5MSvM31oeVPPjdj-0-0e5116ca0a0b105ae4af9755079b44a4)
修改index.wxml文件,示例代码如下:
![](https://epubservercos.yuewen.com/DC4D25/16793576504227606/epubprivate/OEBPS/Images/54_2.jpg?sign=1739339606-utNePd4vc5ZmQPJZGJHjmuRbsWn7ov0a-0-1d58156220832809d1bb7d4b0ba8812b)
运行代码,效果如图2-7所示。
![](https://epubservercos.yuewen.com/DC4D25/16793576504227606/epubprivate/OEBPS/Images/54_3.jpg?sign=1739339606-mHeerRphOOJZ5h8FJ3I5jUHhZnTpxcDz-0-a37b61327ad3136f6dabef6fb8fd1b1c)
图2-7 引入公用组件