WXML 和 HTML 有什么区别

微信小程序用的模板语言叫 WXML(WeiXin Markup Language),看起来跟 HTML 长得很像,但有不少细节不一样。很多刚从前端转过来的同学容易按 HTML 的习惯去写,结果编译报错或者渲染异常。下面这张表整理了主要的语法差异:

特性HTML 写法WXML 写法
数据绑定{{ }} 不生效(需框架){{ message }}
条件渲染无原生语法wx:if="{{condition}}" / wx:elif / wx:else
列表循环无原生语法wx:for="{{list}}" wx:key="id"
事件绑定onclick="handler()"bindtap="handler"
自闭合标签<img src=""> 可选闭合<image /> 必须闭合
图片标签<img><image>
文本标签<span><text>
class 绑定字符串拼接动态 class 用三元表达式

最大的区别在于 WXML 引入了以 wx: 开头的指令来做条件判断和循环遍历,而 HTML 本身不具备这些能力,需要依赖 Vue / React 这类框架来实现类似效果。另外 WXML 对标签闭合的要求比 HTML 严格得多,HTML 里 <img> 不加斜杠也能跑,但在 WXML 里 <image> 必须写成 <image />,否则编辑器会标红。

WXML 格式化前后有什么区别

手写的 WXML 经常缩进混乱、属性排列随意,看着费劲也不利于团队协作。格式化工具的作用就是把这些整理成统一的风格。来看一个实际的例子:

格式化前

<view wx:if="{{showBanner}}"><image src="{{bannerImg}}" mode="aspectFill" class="banner-img"/><text class="title" >{{title}}</text></view>
<view wx:for="{{items}}" wx:key="id"><view class="item"><text>{{item.name}}</text><text class="desc">{{item.desc}}</text></view></view>

格式化后

<view wx:if="{{showBanner}}">
  <image src="{{bannerImg}}" mode="aspectFill" class="banner-img" />
  <text class="title">{{title}}</text>
</view>

<view wx:for="{{items}}" wx:key="id">
  <view class="item">
    <text>{{item.name}}</text>
    <text class="desc">{{item.desc}}</text>
  </view>
</view>

格式化后的代码每个层级都有清晰的缩进,标签之间有换行分隔,属性排列整齐。这在项目代码量变大之后尤其重要——别人接手维护的时候不用花时间猜这段结构到底嵌套了几层。

新手常犯的几个错误

下面这些坑是新手写小程序时经常踩的,大部分跟 WXML 和 HTML 的差异有关。

1. image 标签忘记闭合

<!-- 错误写法 -->
<image src="/images/logo.png">

<!-- 正确写法 -->
<image src="/images/logo.png" />

微信小程序里 image 是一个组件,必须自闭合。漏掉斜杠在某些情况下不会立刻报错,但会导致后续元素解析错位。

2. 把 onclick 当成事件绑定

<!-- 错误写法 -->
<button onclick="handleClick()">提交</button>

<!-- 正确写法 -->
<button bindtap="handleClick">提交</button>

WXML 里绑定事件用 bindcatch 开头的属性,onclickonchange 这些 HTML 事件在这里不生效。bindtap 相当于 click,bindinput 相当于 input 事件的监听。

3. pagePath 没有注册到 app.json

新建了一个页面但忘了在 app.jsonpages 数组里添加路径,导致页面无法被访问或跳转时报错。这是一个很常见的遗漏,尤其是复制粘贴别人的页面代码过来的时候。

4. wx:for 和 wx:if 同时用在同一个标签上

<!-- 性能不理想的写法 -->
<view wx:if="{{showList}}" wx:for="{{list}}" wx:key="id">
  {{item.name}}
</view>

<!-- 更好的做法是把 wx:if 放到外层 -->
<block wx:if="{{showList}}">
  <view wx:for="{{list}}" wx:key="id">
    {{item.name}}
  </view>
</block>

wx:ifwx:for 放在同一个标签上虽然能用,但每次渲染都会重复判断条件。用 <block> 包裹一层把条件判断提到外面,可以减少不必要的运算。

5. 数据绑定的双花括号漏掉

有时候写着写着就直接写了 src="url" 而忘了应该是 src="{{url}}"。WXML 里变量必须用双花括号包裹,否则会被当成纯字符串处理。

微信开发者工具和在线格式化工具有什么区别

微信开发者工具其实内置了格式化功能,快捷键通常是 Shift + Alt + F(Windows)。它的好处是不用离开编辑器,保存时还能自动触发。

在线格式化工具有它自己的适用场景:

  • 别人发给你一段乱糟糟的 WXML 代码,你想快速看看结构
  • 不在自己的开发环境上,没有装微信开发者工具
  • 想把格式化后的代码贴到文档或聊天窗口里给别人看
  • 批量处理多个文件的格式化需求

两者并不冲突,日常开发用 IDE 内置功能,临时处理用线上工具,各管各的场景就好。

提示

写 WXML 的时候注意保持良好的缩进习惯,哪怕一开始写得乱也没关系,写完丢进格式化工具跑一遍就干净了。关键是理解格式化之后的结构,而不是机械地依赖工具来修代码。

常见问题

格式化会改变 WXML 的功能吗?

不会。格式化只调整缩进、换行和空格,不改变标签结构、属性值和逻辑。格式化前后的页面渲染效果完全一致。但注意如果模板字符串里有敏感的空白字符(如  ),格式化工具会保留它们不动。

格式化后代码反而变长了?

正常。压缩过的代码格式化后会增加换行和缩进,体积变大。这不影响运行性能——小程序在发布时会自动压缩代码。开发阶段用格式化后的代码方便阅读和维护。

能格式化 WXSS 吗?

WXSS 本质上就是 CSS,用 CSS 格式化工具处理就行。速工具 的 WXML 格式化工具专注于 WXML 标签结构,WXSS 部分建议用 CSS 格式化工具单独处理。