![微信小程序开发实战](https://wfqqreader-1252317822.image.myqcloud.com/cover/512/30918512/b_30918512.jpg)
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=1739351735-FuMy0TmbqfqXeBjR6zXMezzsmqqp4oP6-0-4d03b1e039fe2d1427af07fe1136d623)
下面逐步解析上面的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=1739351735-xZfhNKtQ2AY0ewEgMDztieE2YgJSD2p0-0-a270a3af81a6feb1c93850168e11504e)
页面所需要的数据通常定义在data属性中,这个属性的更改可以直接触发页面的重绘。修改index.wxml文件中的代码,示例代码如下:
![](https://epubservercos.yuewen.com/DC4D25/16793576504227606/epubprivate/OEBPS/Images/49_3.jpg?sign=1739351735-GTpKiZj9vqazNwlxZ3Zjr1uoLJ79R4nd-0-9dfd38422577c4f934c432d90ac4b55e)
刷新模拟器,效果如图2-2所示,可以看到text组件已经成功绑定了textData数据。
![](https://epubservercos.yuewen.com/DC4D25/16793576504227606/epubprivate/OEBPS/Images/50_1.jpg?sign=1739351735-Z47zKBddyrjesUy3uRSsJVeWA7jPZ0KT-0-749e59f796a9366c88cac32577d46a1e)
图2-2 为组件动态绑定数据
“{{}}”属性绑定的基本语法,不只是标签的内容,标签的属性也可以动态进行绑定,上面示例代码中的文本颜色属性就是通过textColor数据动态设置的,需要注意的是,属性的数据在绑定时,应将其放入引号内。还有一个细节需要注意,若主要标签绑定的数据值为undefined,则标签是不会被渲染的,示例代码如下:
![](https://epubservercos.yuewen.com/DC4D25/16793576504227606/epubprivate/OEBPS/Images/50_2.jpg?sign=1739351735-Ax4dYEyrYylrp3UMdWY3fZ7PSP78QfDi-0-ac7308f8ec24d4ec493cb4a91b1f0f10)
2.2.3 WXML的逻辑能力
除可以直接绑定数据外,“{{}}”还拥有一些简单的逻辑能力,如使用运算符进行一些运算操作:
![](https://epubservercos.yuewen.com/DC4D25/16793576504227606/epubprivate/OEBPS/Images/50_3.jpg?sign=1739351735-f7mcUX5EKNW4o5Q45emnospQJMEv0NJY-0-754151fa7d3c914579ecf040e33a43a3)
运行代码,效果如图2-3所示。
![](https://epubservercos.yuewen.com/DC4D25/16793576504227606/epubprivate/OEBPS/Images/50_4.jpg?sign=1739351735-X236qzct08NtMtUnaHSG4Dl2a3402cg2-0-602eb09d11aeed1c562b9e42a58e2a58)
图2-3 标签绑定数据中添加运算逻辑
WXML也支持进行条件渲染,即当满足判定条件时,此标签才被渲染,通过为标签添加wx:if属性设置条件,示例代码如下:
![](https://epubservercos.yuewen.com/DC4D25/16793576504227606/epubprivate/OEBPS/Images/51_1.jpg?sign=1739351735-xZJ62H2G31tXagAIFzfLdu3I469OenkF-0-4efe9bd8aa55e8a09900786dbcd0b225)
上面的示例代码将wx:if属性对应的值设置为false,刷新模拟器可以看到文本标签将不会被渲染,在通常情况下,wx:if属性绑定的数据是一个条件表达式,示例代码如下:
![](https://epubservercos.yuewen.com/DC4D25/16793576504227606/epubprivate/OEBPS/Images/51_2.jpg?sign=1739351735-BB2n39ilucyKwybf0ntufWu5c8uGXYxo-0-51fd16e6c0e6fbcb1aa36aba313a9e08)
wx:if属性也可以和wx:elif、wx:else结合使用,从而实现更复杂的条件渲染逻辑,示例代码如下:
![](https://epubservercos.yuewen.com/DC4D25/16793576504227606/epubprivate/OEBPS/Images/51_3.jpg?sign=1739351735-Ywllnsy8z8wJ1wSEVM0gGDVu7Ls0RDKn-0-b855252301baabebb0f2b0094bb447ce)
上面的代码会判定textData数据的长度,大于3个字符则在页面上显示textData数据拼接上“!一起来学习吧”,如果不大于3个字符但大于0个字符,则在页面显示textData的值,否则在页面显示“无数据”。
如果需要同时对多个标签进行条件渲染,则可以使用block标签进行包裹,然后控制block标签的渲染条件即可,示例代码如下:
![](https://epubservercos.yuewen.com/DC4D25/16793576504227606/epubprivate/OEBPS/Images/51_4.jpg?sign=1739351735-RNEki84TGzkhFJdlRrcP6KzFQFMtL1qG-0-8b5234d787bfe8a05cf7f12bba3dfb0a)
在学习JavaScript的语法时,我们了解到,分支和循环是程序流程控制的两大逻辑。对于WXML的渲染也是一样,WXML也支持循环渲染标签,这是小程序简单列表的基本开发方式,使用wx:for实现对数组的遍历,并循环渲染标签内部内容,首先在页面数据源中定义一个数据,示例代码如下:
![](https://epubservercos.yuewen.com/DC4D25/16793576504227606/epubprivate/OEBPS/Images/51_5.jpg?sign=1739351735-IZlJ25SR1Joc4qzty62q7N8Eb3EofpiU-0-7c8ce499f17b5dd9a0fa215505dae8f3)
修改index.wxml文件,示例代码如下:
![](https://epubservercos.yuewen.com/DC4D25/16793576504227606/epubprivate/OEBPS/Images/51_6.jpg?sign=1739351735-Yw81yGgXADLMa15UeTMhncEvs41ay9a3-0-bcdbce84f86ffd74a4ebf4a22dd0bb2f)
wx:for属性会对数据进行遍历,并且自动生成两个临时变量:index和item。index为当前遍历数据元素的下标值,从0开始;item为当前遍历出的数据元素。运行上面的代码,效果如图2-4所示。
![](https://epubservercos.yuewen.com/DC4D25/16793576504227606/epubprivate/OEBPS/Images/52_3.jpg?sign=1739351735-veACsC1UaNEq8k6imDc9Ym0W5Y7k32Wg-0-833abee4dab9e6ba1e0bd6c135a42363)
图2-4 循环渲染
开发者也可以对数组遍历的临时变量名进行自定义:wx:for-index用来自定义下标变量名,wx:for-item用来自定义元素变量名。示例代码如下:
![](https://epubservercos.yuewen.com/DC4D25/16793576504227606/epubprivate/OEBPS/Images/52_1.jpg?sign=1739351735-kSQHjGVZQFen6ZQOPWgF2DLfKcCMgGYX-0-97ac799e9dc0b8991cfe3364a83ecccc)
和wx:if的逻辑一样,如果要进行多个标签的循环渲染,可以使用block标签将需要循环的代码块进行包裹,示例代码如下:
![](https://epubservercos.yuewen.com/DC4D25/16793576504227606/epubprivate/OEBPS/Images/52_2.jpg?sign=1739351735-ECwl7IxIuEgsZXv6jHmPH7K045Sb0SRD-0-8d4546fb924e3c692eb703d768c7cddc)
运行代码,效果如图2-5所示。
![](https://epubservercos.yuewen.com/DC4D25/16793576504227606/epubprivate/OEBPS/Images/52_4.jpg?sign=1739351735-yGW5PVoihcHp7GQT8lL2Q3WZ9EOHkzEi-0-d4c87e8733bf31626c4158a73f6e1ef3)
图2-5 组合标签循环渲染
2.2.4 WXML模板
对于组合复杂且复用性强的组件,可以将其定义为模板,在使用时直接使用模板即可,示例代码如下:
![](https://epubservercos.yuewen.com/DC4D25/16793576504227606/epubprivate/OEBPS/Images/52_5.jpg?sign=1739351735-GyHVZ8cAY46wwTqfhh3QV8TuJM6enDx4-0-bda7e78091cd11f154574019f9478041)
在上面的代码中,开始的template标签定义了一个模板,模板的名字为item,后面需要通过模板名指定要使用的模板,模板中可能会用到外面传递的一些数据,在使用模板时,通过设置data属性可以进行数据的传递,上面的示例代码演示了将遍历出的列表数据传递到模板内进行渲染。
上面的示例代码将模板定义在index.wxml文件中,但在实际开发中通常不会这样做,模板一般都是具有复用性的组件,为了便于复用,一般会将模板定义在单独的文件中,在需要使用时进行引用,首先在工程的根目录下创建一个新的文件夹,命名为template,如图2-6所示。
![](https://epubservercos.yuewen.com/DC4D25/16793576504227606/epubprivate/OEBPS/Images/53_2.jpg?sign=1739351735-F8sA26iQCT1kGDqckaNeDM7ExApZwQ3p-0-2a9210d230adb14801031c7c00853175)
图2-6 新建模板文件夹
在template文件夹中新建一个WXML文件,命名为item.wxml,在其中编写如下代码:
![](https://epubservercos.yuewen.com/DC4D25/16793576504227606/epubprivate/OEBPS/Images/53_3.jpg?sign=1739351735-iOYeHAqrI4FW1oMkBRZ9zMytrHa1pmjV-0-987e6f9221d429d042921c7f8b39bc80)
修改index.wxml,示例代码如下:
![](https://epubservercos.yuewen.com/DC4D25/16793576504227606/epubprivate/OEBPS/Images/53_4.jpg?sign=1739351735-I4yhV23Fl4oYUfZIsWCCfECuq4C65gmb-0-0de391529e2d8490c1ea7248bf288c8b)
import标签的作用是导入其他模板文件,在导入时需要注意路径的正确性,与之类似的还有include标签,include标签会将文件中除template标签和wxs标签外的所有内容直接复制到当前include的位置。例如,在工程根目录下新建一个命名为common的文件夹,用来存放公共组件,在其中新建一个命名为header.wxml的文件,编写的代码如下:
![](https://epubservercos.yuewen.com/DC4D25/16793576504227606/epubprivate/OEBPS/Images/54_1.jpg?sign=1739351735-lZAw44ITwWmAWiyvgpilLawM7ZKvGUZC-0-63845e7831e483b1c1fde08626a727df)
修改index.wxml文件,示例代码如下:
![](https://epubservercos.yuewen.com/DC4D25/16793576504227606/epubprivate/OEBPS/Images/54_2.jpg?sign=1739351735-pKpaaN7v60VzSiIF6zk9JV1ZarlxJmKa-0-b2a54e2a89492e3ba3e80b8cca3056c6)
运行代码,效果如图2-7所示。
![](https://epubservercos.yuewen.com/DC4D25/16793576504227606/epubprivate/OEBPS/Images/54_3.jpg?sign=1739351735-uECo2ZzoB0F8J2rPDEGUQETck6T1wFmN-0-52b2b0a8cc86baec95bedd7934205285)
图2-7 引入公用组件