一、前言:WXML 是什么?
在微信小程序中,WXML(WeiXin Markup Language) 是用于描述页面结构的标签语言,类似于 HTML,但专为小程序设计。
📌 核心定位 :
WXML = 小程序的"HTML" + 数据驱动视图引擎
它不支持 DOM 操作,而是通过数据绑定 + 声明式语法 实现动态 UI 更新。
掌握 WXML,是开发小程序的第一步,也是关键一步。
本文将带你:
✅ 理解 WXML 与 HTML 的区别
✅ 掌握五大核心语法:数据绑定、条件渲染、列表渲染、模板引用、事件绑定
✅ 避开常见坑点,写出高效、可维护的模板代码
二、WXML vs HTML:关键差异
| 特性 | HTML | WXML |
|---|---|---|
| 标签 | <div>, <span> |
<view>, <text>, <image> |
| 动态更新 | 操作 DOM(如 innerHTML) |
数据驱动({``{ }} + setData) |
| 逻辑控制 | JavaScript 控制 | 内置指令(wx:if, wx:for) |
| 组件化 | Web Components / 框架 | 自定义组件(.wxml + .js + .json + .wxss) |
💡 记住 :WXML 是静态模板,所有动态行为都依赖 JS 层的数据变化。
三、WXML 五大核心语法详解
1. 数据绑定:{``{ }}
将 JS 中的 data 数据渲染到页面。
示例:
javascript
// index.js
Page({
data: {
title: '欢迎使用小程序',
userInfo: { name: '小明', age: 18 },
count: 100
}
});
XML
<!-- index.wxml -->
<view>{{title}}</view>
<text>姓名:{{userInfo.name}},年龄:{{userInfo.age}}</text>
<view>商品数量:{{count + 1}} 件</view> <!-- 支持简单运算 -->
✅ 支持:
变量访问(
a.b.c)简单表达式(
a + b,a ? 'yes' : 'no')方法调用(需在 JS 中定义)
❌ 不支持:赋值(
{``{ a = 1 }})new / 函数声明
复杂逻辑(应放在 JS 中处理)
2. 条件渲染:wx:if / wx:elif / wx:else
根据条件决定是否渲染某块内容。
示例:
XML
<view wx:if="{{count > 0}}">
库存充足
</view>
<view wx:elif="{{count === 0}}">
暂无库存
</view>
<view wx:else>
库存异常
</view>
⚠️ 注意:
wx:if是惰性渲染(条件为 false 时不创建节点)- 频繁切换建议用
hidden(始终渲染,仅隐藏)
XML
<!-- 性能对比 -->
<view wx:if="{{show}}">...</view> <!-- 切换时重建节点 -->
<view hidden="{{!show}}">...</view> <!-- 始终存在,仅 CSS 隐藏 -->
3. 列表渲染:wx:for
遍历数组或对象,生成重复结构。
基础用法:
javascript
// data
list: [
{ id: 1, name: '苹果' },
{ id: 2, name: '香蕉' }
]
XML
<view wx:for="{{list}}" wx:key="id">
{{index}}. {{item.name}}
</view>
🔑 关键属性:
wx:for:指定数据源wx:key:必须提供 ,用于高效更新(类似 Vue 的key)- 默认变量名:
item(当前项)、index(索引)
自定义变量名:
XML
<view wx:for="{{list}}" wx:for-item="fruit" wx:for-index="i" wx:key="id">
{{i}}. {{fruit.name}}
</view>
💡 提示:
wx:key推荐使用唯一 ID ,避免用*this(仅适用于 primitive 类型)
4. 模板(template)与引用
复用一段 WXML 结构。
定义模板:
XML
<!-- 定义 -->
<template name="productCard">
<view class="card">
<text>{{name}}</text>
<text>¥{{price}}</text>
</view>
</template>
使用模板:
XML
<!-- 引用 -->
<template is="productCard" data="{{...product}}" />
✅ 优势:避免重复代码,提升可维护性
❌ 注意:模板内无法直接访问外部 data,需通过
data传入
5. 事件绑定:bindtap / catchtap 等
响应用户交互(点击、滑动等)。
基础事件:
XML
<button bindtap="handleClick">点击我</button>
<view bindlongpress="onLongPress">长按</view>
javascript
Page({
handleClick(e) {
console.log('按钮被点击', e);
// e.detail / e.currentTarget.dataset 可获取附加数据
}
});
传递参数(通过 data-*):
XML
<button
data-id="123"
data-name="测试商品"
bindtap="handleClick">
购买
</button>
javascript
handleClick(e) {
const { id, name } = e.currentTarget.dataset;
console.log(id, name); // "123", "测试商品"
}
🔥 bind vs catch:
bindtap:事件可冒泡catchtap:阻止冒泡(常用于防止父级误触发)
四、WXML 支持的组件标签(常用)
| 标签 | 说明 |
|---|---|
<view> |
类似 div,块级容器 |
<text> |
文本(支持长按复制) |
<image> |
图片(支持懒加载、mode 裁剪) |
<button> |
按钮(可触发分享、获取用户信息) |
<scroll-view> |
可滚动区域 |
<swiper> |
轮播图 |
<input> / <textarea> |
输入框 |
📌 所有组件详见:微信官方组件文档
五、常见误区与最佳实践
❌ 误区 1:"可以在 WXML 中写 JavaScript 函数"
事实 :WXML 只支持表达式 ,复杂逻辑必须放在 JS 的
methods中。
❌ 误区 2:"wx:for 不加 wx:key 也没事"
事实 :缺少
wx:key会导致列表更新性能下降,甚至 UI 错乱!
✅ 最佳实践:
- 复杂逻辑抽离到 JS,WXML 只负责展示
- 列表务必加
wx:key - 频繁切换用
hidden,低频用wx:if - 事件参数通过
data-*传递,避免闭包陷阱
六、实战小例子:待办事项列表
javascript
<!-- wxml -->
<view class="todo-list">
<view wx:for="{{todos}}" wx:key="id" class="todo-item">
<checkbox checked="{{item.done}}" bindchange="toggleTodo" data-id="{{item.id}}" />
<text class="{{item.done ? 'done' : ''}}">{{item.text}}</text>
<button catchtap="deleteTodo" data-id="{{item.id}}">删除</button>
</view>
<input placeholder="请输入新任务" bindinput="onInput" value="{{inputValue}}" />
<button bindtap="addTodo">添加</button>
</view>
配合 JS 即可实现完整功能!
七、结语
感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!