想象一下,你是一位积木建筑师,面前有一堆五颜六色的积木块。有的积木是“墙体”(承载内容),有的是“涂料”(决定外观),还有的是预装好的“功能模块”(自带灯光的窗户、能开合的门)。你的任务是用这些积木搭建一栋既能住人又美观的房子。小程序开发正是如此——WXML 是墙体和房间结构(决定页面长什么样),WXSS 是涂料和壁纸(决定页面好不好看),组件则是预制模块(把常用功能打包成积木块,随时取用)。而今天的重点——WXML/WXSS 与组件化开发,就是教你如何高效地搭建这栋“数字积木房”。

岗位关联

理解小程序视图层的设计哲学,是成为跨平台前端开发者的第一步。它能帮你从“写死页面”进阶到“像搭积木一样构建功能”,无论是微信、支付宝还是抖音小程序,这套底层逻辑都高度相通。

目录
  1. 可视化演示
  2. WXML标记语言
  3. 数据绑定机制
  4. 列表渲染
  5. 条件渲染
  6. rpx响应式单位
  7. WXSS样式系统
  8. 组件化开发
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示CNN卷积运算过程:卷积核在输入特征图上滑动计算加权和,经ReLU激活后生成输出特征图。支持卷积运算与多层特征提取模式切换。

本节配有交互动效(进入视口后自动加载,约 3KB)。

卷积运算流程 卷积核在输入上滑动计算加权和 ReLU激活函数引入非线性 Y(i,j)=ΣΣ X(i+m,j+n)·K(m,n)+b 局部感知与权值共享

WXML标记语言

积木房的“墙体说明书”

回到我们搭积木的场景。你准备搭建一栋小房子,首先需要一份图纸告诉每块墙体积木放在哪里、房间怎么隔断。在小程序的世界里,WXML(WeiXin Markup Language)就是这份“墙体说明书”,它定义了页面的结构和布局。

WXML 是微信小程序专用的标记语言,与网页开发中的 HTML 非常相似,但针对移动端和原生体验做了优化。WXML 使用标签(如 <view>、<text>、<button>)来定义界面的结构。你可以把 <view> 想象成一块通用的墙体积木(类似 HTML 的 <div>),<text> 是门牌标签(类似 <span>),<button> 是带功能的门铃按钮。

与 HTML 最大的不同在于,WXML 的标签更贴近移动端交互场景,并且天生支持数据绑定(后续会介绍)。它还严格要求标签闭合,就像积木必须严丝合缝地拼接,否则整面墙会松动。如果你写过 HTML,会发现 WXML 的入门成本极低——两者都是“用标签描述结构”的语言。

1. 视图层结构:WXML 是视图层的骨架语言,负责描述页面元素的组织方式。

WXML 结构={嵌套标签}\text{WXML 结构} = \{ \text{嵌套标签} \}

2. 与HTML异同:同源于标记语言家族,但 WXML 针对移动端优化,内置组件更丰富。

WXML≈HTML+移动端专属标签\text{WXML} \approx \text{HTML} + \text{移动端专属标签}

3. 标签语义化:每个 WXML 标签都有明确的视觉或功能语义,就像积木上的颜色标记。

语义化=标签↦功能含义\text{语义化} = \text{标签} \mapsto \text{功能含义}

回到积木房:墙体积木上如果有凹槽和凸起(语义化标签),你就能一眼看出哪块应该放在哪个位置。WXML 的标签名称本身就在告诉你它的用途——这块积木是承重墙(<view>),那块是门窗(<button>),这块是做装饰的壁灯(<text>)。

xml4 行
<view class="header">  <text>欢迎来到积木小屋</text>  <button>点击开门</button></view>

数据绑定机制

给墙体装上“智能开关”

传统 HTML 页面里,内容写死之后就像被涂料封死的墙面——想换颜色只能重新粉刷。但在 WXML 中,墙体上的文字、属性值甚至结构都可以和 JavaScript 中的数据进行绑定。这就像给每面墙装上了“智能开关”:你只需在控制中心(JS 文件)里改数据,墙面上的显示就会自动更新。

数据绑定的核心是双大括号语法 {{ }}(也叫 Mustache 语法),就像在墙上预留了一个“数据插槽”。页面加载时,插槽会自动从 JS 数据源中取出对应的值填入。

这种“数据驱动视图”的模式,意味着你永远不需要亲自去操作 DOM 节点改内容(就像不需要拿螺丝刀去一块块拆墙换积木),只需修改 JS 中的数据,页面就会自动响应。这是小程序与早期原生开发最大的思维转变。

1. 双大括号语法:{{ }} 是 WXML 中读取 JS 变量的统一入口。

{{变量名}}↦变量值\{ \{ \text{变量名} \} \} \mapsto \text{变量值}

2. 数据驱动视图:视图是数据的函数,数据变化时视图自动更新。

View=f(Data)\text{View} = f(\text{Data})

3. 动态属性绑定:标签属性也能绑定数据,如 disabled="{{!doorOpen}}"。

attr={{表达式}}\text{attr} = \{ \{ \text{表达式} \} \}

回到积木房:你不再需要半夜爬起来拿手电筒照亮墙上的文字去修改,只需要在总控台上的触控屏(JS 数据)上滑动一下,墙上的灯光字样就会自动变化。数据绑定让开发者的角色从“泥瓦工”升级为“智能家居控制员”。

js7 行
// page.jsPage({  data: {    greeting: '欢迎来到积木小屋',    doorOpen: true  }})
xml6 行
<!-- page.wxml --><view>  <text>{{greeting}}</text>  <!-- 动态属性绑定:门是否打开决定了按钮文字的显示状态 -->  <button disabled="{{!doorOpen}}">门已开启</button></view>

列表渲染

批量生产积木墙

假设你要在积木房的一面墙上贴满照片,每张照片需要一个相框。在传统开发中,你得一块块地粘贴,写 10 张照片就要写 10 个相框标签。但在 WXML 中,你只需要一个“批量生产指令”——wx:for——就能让积木工厂自动复制 N 个指定结构的相框,分别填入不同的照片。

列表渲染是 WXML 最强大的功能之一。它使用 wx:for 指令绑定一个数组,将数组中的每一项渲染为一个标签块。就像给积木工厂下达“生产 10 个相同结构相框”的命令,工厂会按清单(数组)一张张地把照片装进框里。

默认情况下,循环中每一项可以用 item 访问,索引用 index 访问(就像工厂流水线上每个工位的工号和工位号)。wx:key 是给每块“批量积木”一个唯一身份证,让小程序能精准地识别哪块积木要更新、删除或移动——这关系到渲染性能,特别是在列表很长或需要频繁增删时。

1. wx:for指令:遍历数组,将每个元素渲染为一个视图块。

∀xi∈列表:渲染(xi)\forall x_i \in \text{列表}: \text{渲染}(x_i)

2. 索引与项:item 表示当前元素,index 表示位置编号。

item=array[index]\text{item} = \text{array}[\text{index}]

3. key的作用:wx:key 提供稳定标识,优化更新性能。

key=唯一标识符\text{key} = \text{唯一标识符}

回到积木房:有了批量生产线,你不需要一块一块地砌墙,工厂会按你的图纸(wx:for)批量生产结构相同的积木块,并把不同数据(照片)填进每块积木中。如果某块积木的照片要替换,工人只看身份证(wx:key)就能找到正确的那一块。

xml4 行
<view wx:for="{{photos}}" wx:key="id">  <image src="{{item.url}}" />  <text>{{index + 1}} / {{photos.length}}</text></view>

条件渲染

积木房的“智能分流闸门”

积木房里有的房间只在特定场景下才需要开放——比如逢年过节才打开会客厅的吊灯。WXML 的条件渲染指令 wx:if 就像在积木房内部安装了一个“智能分流闸门”:当满足条件时,积木块才被安装到墙面上;不满足时,这块积木就完全不存在。

这段代码的逻辑是:当 userVIP 为真,只渲染第一块积木;否则看 userRegistered,如果为真则渲染第二块;两个都不满足就渲染第三块(wx:else)。这三块积木在同一时刻最多只有一块存在,就像闸门只放行一个方向的人流。

需要区分的是 wx:if 和 hidden 属性的不同:wx:if 是“不满足就直接不生产这块积木”(条件性挂载/卸载),而 hidden 是“积木一直存在,只是用布盖上看不见”(CSS 的 display:none)。如果某个模块只在特殊场景出现一次,用 wx:if 更省资源;如果频繁切换显隐,hidden 更高效,因为它不需要反复创建和销毁积木块。

1. wx:if指令:条件为真时渲染该标签块。

渲染={是condition=true否condition=false\text{渲染} = \begin{cases} \text{是} & \text{condition} = \text{true} \\ \text{否} & \text{condition} = \text{false} \end{cases}

2. wx:elif分支:多个条件依次判断,只执行第一个为真的分支。

if-elif-else:"最多一个分支为真"\text{if-elif-else}: "最多一个分支为真"

3. wx:else默认:所有条件不满足时兜底渲染。

else=¬条件1∧¬条件2\text{else} = \neg \text{条件}_1 \land \neg \text{条件}_2

回到积木房:你不需要把会客厅的吊灯一直装在墙上落灰——只有在节日模式开启时才从储物间取出来装上去。条件渲染让积木房具备“场景感知能力”,不同状态下展示不同的空间布局。

xml9 行
<view wx:if="{{userVIP}}">  <text>尊贵的VIP用户,欢迎光临</text></view><view wx:elif="{{userRegistered}}">  <text>注册用户,登录后查看完整内容</text></view><view wx:else>  <text>游客模式</text></view>

rpx响应式单位

积木的“弹性标尺”

在移动端开发中,最大的痛点是屏幕尺寸千奇百怪:iPhone SE 的屏幕宽度是 320pt,iPhone Pro Max 是 414pt,安卓低端机可能只有 360px。如果你用固定的 px 来量积木尺寸,同样的积木在大屏上显得很小、在小屏上显得很大,就像用统一的鞋码给所有人穿鞋。小程序给出的解决方案是 rpx(responsive pixel,响应式像素)。

rpx 的换算规则非常简单:小程序规定所有设备的屏幕宽度一律视为 750rpx。也就是说,无论你的手机屏幕实际物理宽度是多少,都会被等分成 750 份,1rpx 就是其中一份。

这意味着,你在 iPhone SE 上设计一个宽度为 375rpx 的按钮,它会自动占据屏幕宽度的一半(375/750 = 50%);在 iPhone 14 上,它依然会占据屏幕宽度的一半,只是实际像素值变大了。设计师只需要按 750px 宽的设计稿出图,开发者直接量尺寸标注即可,无需做换算。

1. 自适应屏幕:屏幕宽度恒定为 750rpx,等分产生自适应效果。

rpx=屏幕宽度750\text{rpx} = \frac{\text{屏幕宽度}}{750}

2. 设计稿换算:设计稿宽度 750px 对应当前设备 750rpx,无需额外计算。

px↦rpx:"源码直接量标注即可"\text{px} \mapsto \text{rpx}: "源码直接量标注即可"

3. 1rpx含义:1rpx 在第 i 台设备上的实际像素值为屏幕宽度的 1/750。

pxi=Wi750×rpx\text{px}_i = \frac{W_i}{750} \times \text{rpx}

回到积木房:你的积木不是用固定厘米标尺生产的,而是用“屏幕宽度百分比标尺”生产的。无论房子放在多大尺寸的墙上(屏幕),积木在视觉上总是保持相同的占墙比例——大屏上积木变大,小屏上积木变小,但格局始终如一。

text3 行
iPhone SE  (宽 320px) : 1rpx = 320/750 ≈ 0.43pxiPhone 14  (宽 390px) : 1rpx = 390/750 ≈ 0.52px安卓大屏   (宽 414px) : 1rpx = 414/750 ≈ 0.55px

WXSS样式系统

积木房的“装修风格手册”

如果 WXML 是墙体的结构图纸,那 WXSS(WeiXin Style Sheets)就是装修风格手册。它决定墙体的颜色、积木的圆角、文字的字体和间距——所有和“好不好看”相关的事都归它管。

WXSS 与网页开发中的 CSS 几乎完全一致,同样支持类选择器、ID 选择器、标签选择器和后代选择器等。在样式文件中,你可以为每个组件定义外观,就像给不同类型的积木涂上不同的漆料、贴上不同的纹理。

WXSS 独有的加分项有两个:一是全面支持 rpx 单位(上一节学到的弹性标尺),二是支持 page 选择器用于设置全局页面样式。此外,WXSS 也继承了 CSS 的层叠机制——多个规则同时命中时,根据“就近原则”(后写覆盖先写,特定性高的覆盖低的)来决定最终生效的样式。这就好比装修时你给积木先上一层统一的底漆,又在个别积木上加了装饰色——装饰色会盖住底漆,但没加装饰色的积木仍显示底漆。

1. 选择器类型:类选择器 .class 和 ID 选择器 #id 命中目标积木。

样式={选择器↦声明块}\text{样式} = \{ \text{选择器} \mapsto \text{声明块} \}

2. 样式优先级:命中的多个规则按特定性和源码顺序决定取胜者。

优先级=ID>类>标签\text{优先级} = \text{ID} > \text{类} > \text{标签}

3. 主题变量:CSS 变量在 page 中定义,使用时用 var(...) 引用。

–变量名↦属性值\text{--变量名} \mapsto \text{属性值}

回到积木房:你的装修队不会一块块地单独涂色,而是用“标签枪”(选择器)一次性给所有标有“类名”的积木喷上指定颜色。如果你想换整体风格,只需改动 page 里的主题变量——整栋房子的色调瞬间焕然一新。

css16 行
/* 类选择器 */.header {  background-color: #818CF8;  padding: 16rpx;  border-radius: 8rpx;} /* 主题变量(CSS 自定义属性) */page {  --primary-color: #818CF8;  --danger-color: #F43F5E;} .button {  background-color: var(--primary-color);}

组件化开发

预制积木块的封装艺术

回到最初搭积木的画面:如果每一栋房子都要从零开始切木头、做窗框、装门铰链,效率会非常低下。真正的积木高手会用“预制积木”——已经组装好的门窗模块,可以在任意项目中直接使用。小程序开发中的组件化,正是这种“预制积木”的工程化实践。

一个自定义组件由四个文件组成:.json(组件配置)、.wxml(结构)、.wxss(样式)、.js(逻辑)。这四件套就像一份完整的“积木说明书+预制块+使用手册”。开发者将常用的功能封装成组件后,可以在页面的任意位置引用,一次编写、处处复用。

在页面中使用这个组件:

关键点在于样式隔离:组件的样式默认不会泄漏到外部,外部的全局样式也无法侵入组件内部。这就像预制积木的墙体自带防水层——外面的雨水进不来,里面的水管漏水也不会影响邻居。如果必须让外部控制组件样式,可以通过 externalClasses 或 styleIsolation 配置实现白名单透传。

主题定制则是更高阶的玩法:通过 CSS 变量 + 组件属性组合,让同一个组件在不同场景下呈现不同的视觉风格——就像同一款预制积木,换个漆色就能融入不同装修风格的房子。

1. 封装三要素:结构(WXML)、样式(WXSS)、逻辑(JS)打包为独立单元。

组件={WXML,WXSS,JS}\text{组件} = \{ \text{WXML}, \text{WXSS}, \text{JS} \}

2. 样式隔离:组件内外样式互相独立,防止污染。

style组件内部∩style外部=∅\text{style}_\text{组件内部} \cap \text{style}_\text{外部} = \varnothing

3. 主题定制:通过属性和 CSS 变量让组件适配多种视觉主题。

主题=Φ(变量,属性)\text{主题} = \Phi(\text{变量}, \text{属性})

回到积木房:你最得意的发明是那扇“通用魔法门”——同一款积木门,装在儿童房时是粉色把手(主题A),装在书房时是深色木纹(主题B),但门的结构和开关逻辑完全一样。这就是组件的价值:让制造者专注做一块好积木,让使用者只需决定把积木放在哪面墙上。

xml4 行
<!-- components/custom-button/custom-button.wxml --><view class="custom-btn" style="background: {{bgColor}}">  <slot></slot></view>
xml2 行
<custom-button bgColor="#10B981">确认</custom-button><custom-button bgColor="#F43F5E">删除</custom-button>

AI 应用场景

智能小程序页面辅助生成

阶段:代码生成与模板匹配

解决的问题:传统方式下,开发者需要从零编写每个页面的 WXML 结构和 WXSS 样式,重复劳动量大且容易出错。AI 通过理解自然语言描述,可以自动生成符合小程序规范的 WXML/WXSS 代码,甚至自动选用合适的组件。

具体案例:某电商团队使用大语言模型辅助开发,只需输入“生成一个商品卡片组件,左边图片右边价格和名称,底部加一个收藏按钮”,AI 就能输出对应的 WXML 结构和 WXSS 样式,并自动使用 rpx 单位适配不同屏幕。开发者只需微调细节,开发效率提升约 40%。

设计稿自动转小程序代码

阶段:图像识别与代码合成

解决的问题:设计师交付的视觉稿(PNG/PSD 格式)需要前端手动还原为 WXML/WXSS,流程长且容易产生还原偏差。AI 视觉模型可以识别设计稿中的布局结构、颜色和间距,直接生成可运行的小程序代码。

具体案例:某团队接入了一款基于多模态大模型的“设计稿转代码”工具。输入一张注册页面设计稿,模型自动识别出三个输入框、一个主按钮和一个服务协议链接,生成对应的 WXML 标签、WXSS 样式(包括 rpx 换算、主题色提取),并通过 wx:for 优化了输入框的重复结构。

Python 演示

python96 行
"""模拟小程序 WXML 模板引擎的核心逻辑:数据绑定、列表渲染、条件渲染的迷你实现。"""import reimport jsonimport itertools  class TemplateParser:    """一个极简的模板解析器,模拟小程序数据绑定机制"""     def __init__(self):        self.data = {}        # 绑定缓存:状态值 -> 对应变量名列表        self.bind_cache = {}     def render_wxml(self, template, data):        """        渲染 WXML 模板:        1. 处理 wx:if 条件渲染        2. 处理 wx:for 列表渲染        3. 处理 {{ }} 数据绑定        """        self.data = data        self.bind_cache.clear()        result = self._handle_conditions(template)        result = self._handle_lists(result)        result = self._handle_bindings(result)        return result     def _handle_conditions(self, template):        """模拟 wx:if / wx:elif / wx:else 逻辑"""        pattern = r'<view wx:if="\{\{(\w+)\}\}">(.*?)</view>'        pattern_elif = r'<view wx:elif="\{\{(\w+)\}\}">(.*?)</view>'        pattern_else = r'<view wx:else>(.*?)</view>'         def replace_if(match):            cond = bool(self.data.get(match.group(1)))            return match.group(2) if cond else ''         def replace_elif(match):            cond = bool(self.data.get(match.group(1)))            return match.group(2) if cond else ''         def replace_else(match):            return match.group(1)         template = re.sub(pattern, replace_if, template)        template = re.sub(pattern_elif, replace_elif, template)        template = re.sub(pattern_else, replace_else, template)        return template     def _handle_lists(self, template):        """模拟 wx:for 列表渲染"""        pattern = r'<view wx:for="\{\{(\w+)\}\}">(.*?)</view>'         def replace_list(match):            list_name = match.group(1)            items = self.data.get(list_name, [])            inner = match.group(2)            return ''.join(                inner.replace('{{item}}', str(it))                    .replace('{{index}}', str(i))                for i, it in enumerate(items)            )         return re.sub(pattern, replace_list, template)     def _handle_bindings(self, template):        """模拟 {{ }} 最简单数据绑定"""        pattern = r'\{\{(\w+)\}\}'         def replace_binding(match):            var_name = match.group(1)            self.bind_cache[var_name] = self.data.get(var_name, '')            return str(self.bind_cache[var_name])         return re.sub(pattern, replace_binding, template)  if __name__ == '__main__':    parser = TemplateParser()    page_info = {        'greeting': '欢迎来到积木小屋',        'doorOpen': True,        'userVIP': True,        'photos': ['照片A', '照片B', '照片C'],    }    wxml_source = """    <view wx:if="{{userVIP}}">{{greeting}}</view>    <view wx:else>游客模式</view>    <view wx:for="{{photos}}">照片:{{item}} #{{index}}</view>    """    print("===== 渲染结果 =====")    print(parser.render_wxml(wxml_source, page_info))
目的:用 Python 模拟小程序 WXML 的三大核心语法执行原理——条件渲染、列表渲染和数据绑定。
  1. class TemplateParser模板解析器的核心类,封装了三种渲染能力。
  2. self.bind_cache缓存绑定结果,用 _cache 后缀避免与类方法 render_wxml 等产生命名冲突。
  3. render_wxml(template, data)总入口方法,依次调用三个处理函数。
  4. _handle_conditions(template)用正则匹配 wx:if/elif/else,条件为假时直接移除标签块。
  5. replace_if(match)根据 data 中的布尔值决定保留还是清空分支内容。
  6. _handle_lists(template)处理 wx:for,用 enumerate 同时拿到索引和元素。
  7. inner.replace('{{item}}', ...)模拟小程序中的 item 和 index 占位符替换。
  8. _handle_bindings(template)最后处理普通 {{变量}} 绑定,用 str() 统一转字符串。
  9. if __name__ == '__main__':提供可执行入口,演示三种语法同时作用的效果。

常见误区

误区我觉得 `wx:if` 和 `hidden` 都能控制元素显示隐藏,所以性能都一样,哪个顺手就用哪个。有时候元素频繁切换显隐,我就用 `wx:if`,结果页面越来越卡。

正解两者的本质完全不同。wx:if 是“条件性挂载”——条件为假时元素根本不存在于页面结构中,销毁代价高但初始化开销只在真正出现时产生;hidden 则不管条件真假,元素始终存在于 DOM 中,只是通过 display:none 隐藏。比如积木房里的吊灯,wx:if 是不用时把灯拆下来收进储物间,hidden 是灯一直挂在墙上只是拉灭了。频繁切换场景应该用 hidden,因为拆装(创建/销毁)比开关灯(显隐切换)成本高得多。

为何常见:很多从传统 Web 转过来的开发者受 jQuery 时代 show()/hide() 影响,默认只关注“能不能隐藏”而不关心底层实现差异。

误区既然组件的样式是隔离的,那组件内部就不能用任何全局样式了,所有样式都得写在组件自己的 wxss 文件里,外部也完全没法影响组件外观。

正解样式隔离并不是绝对的黑盒。小程序提供 externalClasses(外部样式类)和 styleIsolation: 'apply-shared' 等机制允许白名单式的样式透传。更理性地看,“隔离”是有意设计的工程约束——默认隔离保证组件不受外部污染,但需要定制时通过信使(externalClasses)传递有限样式。这和现实中的预制积木一样:门是标准件,但允许客户在门板上换把手和漆色,而不允许拆掉门框结构(内部实现)。

为何常见:初学者容易望文生义,把“隔离”理解成“封闭”,忽略了文档中关于例外条款的说明。

误区rpx 就是 px 的别名,写 750rpx 就是写 750px,在电脑的开发者工具里显示什么样真机上就是什么样。

正解rpx 是相对单位,它的核心逻辑是“视图宽度恒为 750rpx”。在 375px 宽的手机上,1rpx = 0.5px,所以 750rpx 恰好装满整个屏幕宽度。但在 414px 宽的手机上,1rpx ≈ 0.55px,750rpx 依然恰好装满屏幕。真正的好处是不需要写媒体查询就能适配所有屏幕。但要注意:rpx 不适用于 1px 的物理细线需求(因为某些设备上 1rpx 可能小于 1 物理像素导致渲染模糊),此时需要用固定 px 或 transform: scale() 技巧。

为何常见:因为数字一样(750),开发者工具和 iPhone 6/7/8 上 750rpx 恰好等于 375px,导致很多人误以为它们是同一个东西。

误区如果我写一个组件只是展示一些静态的 UI,不需要任何交互,那我还不如直接复制粘贴 WXML 片段,用普通 view 就行,没必要搞成组件。

正解组件化带来的价值不仅仅是逻辑复用,还包括结构复用和样式复用。即使一个组件完全没有 JS 逻辑(无状态展示型组件),将其封装成组件仍然能获得:统一修改入口(改一处全项目生效)、样式隔离保护、Slot 插槽扩展能力。就像一块没有电子元件的标准积木门——它依然是有价值的预制件,因为统一规格让整个积木房的模块化成为可能。

为何常见:开发者容易把“组件”误解为“带逻辑的功能块”,而忽略了工程化中“复用”和“统一”的核心价值。

面试题

Q1. WXML 中小程序页面的结构类似于以下哪种网页语言?

单选题 · easy

  • A.HTML 标记语言← 正确答案
  • B.CSS 样式语言
  • C.JavaScript 脚本语言
  • D.Python 编程语言

答案:A。WXML 是标记语言,结构上类似 HTML,使用标签描述页面骨架。CSS 和 JavaScript 分别对应 WXSS 和 JS 层的职责,Python 则完全不相关。

Q2. 小程序 WXML 中数据绑定的标准语法是?

单选题 · easy

  • A.${变量名}
  • B.{{变量名}}← 正确答案
  • C.#{变量名}
  • D.@{变量名}

答案:B。双大括号 {{ }} 是 WXML 数据绑定专用语法(Mustache 模板风格),类似于在墙体上预留数据插槽。${} 是 ES6 模板字符串语法,#{} 是 Ruby 语法,@{} 不存在于小程序规范中。

Q3. wx:for 指令中,默认的当前项变量名和索引变量名是?

单选题 · easy

  • A.value 和 key
  • B.data 和 num
  • C.item 和 index← 正确答案
  • D.element 和 position

答案:C。wx:for 默认把当前项暴露为 item,索引暴露为 index。这和积木流水线上的“工位内容”和“工位号”对应,是框架预设的默认命名规则。

Q4. 关于 wx:if 和 hidden 的区别,以下哪种说法最准确?

单选题 · mid

  • A.两者都是通过 display:none 实现隐藏
  • B.wx:if 条件为假时元素不渲染,hidden 仅隐藏但元素存在← 正确答案
  • C.hidden 条件为假时元素不渲染,性能更优
  • D.两者完全等价,可以互换使用

答案:B。wx:if 是条件性挂载,假值时元素不存在于页面结构中(拆下积木);hidden 是 CSS 显示隐藏,元素始终存在(灯还挂着只是熄灭了)。频繁切换场景用 hidden 更高效,因为避免重复创建销毁。

Q5. 在屏幕宽度为 375px 的设备上,750rpx 对应的实际像素宽度是?

单选题 · mid

  • A.375px← 正确答案
  • B.750px
  • C.187.5px
  • D.100px

答案:A。所有设备屏幕宽度恒定为 750rpx,所以 375px 宽屏幕上 1rpx = 375/750 = 0.5px,750rpx = 750 × 0.5 = 375px,恰好等于整个屏幕宽度。这是 rpx 自适应设计的核心。

Q6. 下面哪些是自定义组件四个文件的组成部分?

多选题 · mid

  • A..json 配置文件← 正确答案
  • B..wxml 结构文件← 正确答案
  • C..wxss 样式文件← 正确答案
  • D..md 文档文件

答案:ABC。自定义组件四件套为 .json(配置)、.wxml(结构)、.wxss(样式)、.js(逻辑)。.md 是 Markdown 文档文件,不参与组件工程结构。

Q7. 关于组件样式隔离,以下哪种说法最正确?

单选题 · hard

  • A.组件内可随意使用外部全局样式类
  • B.外部样式无法以任何方式影响组件内部
  • C.默认隔离但可用 externalClasses 白名单透传← 正确答案
  • D.样式隔离只影响字体不影响布局

答案:C。默认各组件的样式互相隔离,防止污染,但提供了 externalClasses 和 styleIsolation: 'apply-shared' 等例外机制。白名单透传的比喻:门是标准件但允许客户换把手——受控定制,而非绝对封闭。

Q8. WXSS 中关于主题变量的使用,哪些说法是正确的?

多选题 · hard

  • A.主题变量用 --变量名 语法定义← 正确答案
  • B.地方使用 var(--变量名) 引用变量← 正确答案
  • C.主题变量只能在 page 选择器中定义
  • D.变量可以简化全局换肤操作← 正确答案

答案:ABD。CSS 自定义属性用 --name 定义,var(--name) 引用,可定义在 page 选择器或任意规则块中,并非只能定义在 page 中。通过改变变量值实现全局换肤,是主题定制的核心思路。

Q9. wx:key 在列表渲染中的主要作用是?

单选题 · hard

  • A.改变列表的排列顺序
  • B.为每个项提供稳定唯一身份,优化更新性能← 正确答案
  • C.控制列表项的显示样式
  • D.限制列表最大渲染数量

答案:B。wx:key 给每个渲染项一个“身份证号”(唯一标识),框架据此判断哪些项需要被复用、更新或删除,避免全部重新渲染导致性能浪费。它不控制顺序、样式或数量。

Q10. 以下哪些是 WXML 支持的渲染能力?

多选题 · easy

  • A.数据绑定双大括号← 正确答案
  • B.wx:for 列表循环← 正确答案
  • C.wx:if 条件判断← 正确答案
  • D.SQL 数据库查询

答案:ABC。WXML 三大核心渲染能力是数据绑定、列表渲染(wx:for)、条件渲染(wx:if/elif/else)。SQL 是数据库查询语言,与视图层渲染无关。