一、WXML 模板语法
1. 数据绑定
通过双大括号 {{ }} 实现数据与视图的绑定,支持内容、属性和简单运算。
内容绑定:<view>{{ message }}</view>,其中 message 是页面 data 中的数据
属性绑定:<image src="{{ imgUrl }}"></image>,属性值需用双引号包裹
运算支持:
算术运算:{{ 1 + 2 }}
逻辑判断:{{ isShow ? '显示' : '隐藏' }}
字符串拼接:{{ 'Hello ' + name }}
2. 条件渲染
根据条件控制元素是否渲染,主要有 wx:if 和 hidden 两种方式。
wx:if 系列:
<view wx:if="{{ score > 90 }}">优秀</view>
<view wx:elif="{{ score > 60 }}">及格</view>
<view wx:else>不及格</view>
特点:动态创建/移除元素,适合条件不常变化的场景
hidden:
<view hidden="{{ isHide }}">内容</view>
特点:通过样式控制显示(display: none),适合频繁切换的场景
3. 列表渲染
通过 wx:for 循环渲染列表数据,配合 wx:key 提高性能。
基本用法:
<view wx:for="{{ list }}" wx:key="index">
{{ index }}: {{ item.name }}
</view>
item 为当前项,index 为索引,默认名称可通过 wx:for-item 和 wx:for-index 自定义
wx:key 作用:标识列表项唯一性,推荐使用数据中的唯一字段(如 id),避免使用 index(频繁更新时可能出错)
4. 事件绑定
响应用户交互,通过 bind:事件名 或 catch:事件名 绑定,事件处理函数定义在页面 .js 中。
常用事件:tap(点击)、input(输入)、change(值改变)、longpress(长按)
基本用法:
<button bind:tap="handleTap">点击</button>
// 页面 .js 中
Page({
handleTap(e) {
console.log('点击事件触发', e)
}
})
传递参数:通过 data-* 自定义属性,在事件对象中通过 e.currentTarget.dataset 获取
<button bind:tap="handleClick" data-id="123">点击</button>
// 页面 .js 中
handleClick(e) {
console.log(e.currentTarget.dataset.id) // 输出 123
}
bind 与 catch 区别:bind 不阻止事件冒泡,catch 阻止事件冒泡
5. 表单双向绑定
通过 wx:model 实现表单控件与数据的双向绑定。
<input wx:model="{{ username }}" type="text" placeholder="请输入用户名" />
<checkbox wx:model="{{ isAgree }}" />同意协议
// 页面 .js 中
Page({
data: {
username: '',
isAgree: false
}
})
二、WXSS 样式语法
1. 基础语法
WXSS 基于 CSS 扩展,支持大部分 CSS 选择器和属性,新增 rpx 尺寸单位和样式导入功能。
2. 尺寸单位 rpx
rpx(responsive pixel)是自适应单位,规定屏幕宽度为 750rpx,适配不同设备。
示例:在 375px 宽的设备上,1rpx = 0.5px;在 750px 宽的设备上,1rpx = 1px。
<view style="width: 375rpx; height: 100rpx;"></view>
3. 样式导入
通过 @import 导入外部 WXSS 文件,路径为相对路径。
// 页面 .wxss 中
@import "../../common/common.wxss";
.container {
padding: 20rpx;
}
4. 选择器
支持的选择器:类选择器(.class)、id 选择器(#id)、元素选择器(view、button 等)、后代选择器(.parent .child)、伪类选择器(:active、:focus)。
不支持通配符(*)、属性选择器([attr])等。
5. 全局与局部样式
全局样式:在 app.wxss 中定义,作用于所有页面
局部样式:在页面 .wxss 中定义,仅作用于当前页面,同名样式会覆盖全局样式(遵循 CSS 优先级)
三、页面与应用配置语法
1. 全局配置(app.json)
配置小程序全局属性,如页面路径、窗口表现、tabBar 等,格式为 JSON 对象。
{
"pages": [
"pages/index/index",
"pages/logs/logs"
],
"window": {
"navigationBarTitleText": "小程序示例",
"navigationBarBackgroundColor": "#ffffff",
"navigationBarTextStyle": "black"
},
"tabBar": {
"list": [
{
"pagePath": "pages/index/index",
"text": "首页",
"iconPath": "/images/home.png",
"selectedIconPath": "/images/home-selected.png"
},
{
"pagePath": "pages/logs/logs",
"text": "日志",
"iconPath": "/images/log.png",
"selectedIconPath": "/images/log-selected.png"
}
]
}
}
2. 页面配置(页面 .json)
配置当前页面的窗口表现,覆盖全局配置中 window 字段的同名属性。
{
"navigationBarTitleText": "首页",
"enablePullDownRefresh": true,
"backgroundTextStyle": "dark"
}
四、WXS 脚本语法
1. 基本概念
WXS(WeiXin Script)是小程序的脚本语言,用于在 WXML 中处理数据,不能在 .js 中使用,语法类似 JavaScript 但有差异。
2. 使用方式
WXML 中嵌入 WXS:
<wxs module="m1">
function formatPrice(price) {
return '¥' + price.toFixed(2);
}
module.exports = {
formatPrice: formatPrice
};
</wxs>
<view>{{ m1.formatPrice(99) }}</view> // 输出 ¥99.00
引用外部 WXS 文件:
// utils/tools.wxs
function toUpperCase(str) {
return str.toUpperCase();
}
module.exports = {
toUpperCase: toUpperCase
};
// 页面 WXML 中
<wxs src="/utils/tools.wxs" module="tools"></wxs>
<view>{{ tools.toUpperCase('hello') }}</view> // 输出 HELLO
3. 与 JavaScript 差异
变量声明:仅支持 var,不支持 let、const
函数定义:仅支持 function 关键字,不支持箭头函数
作用域:与 .js 作用域隔离,不能调用小程序 API 或 .js 中定义的函数
数据类型:支持 number、string、boolean、object、array、function、date、regexp 等
五、网络请求语法
1. wx.request 基本用法
wx.request({
url: 'https://api.example.com/data', // 必须为 HTTPS 协议
method: 'GET', // 请求方法,默认 GET
data: {
id: 123
},
header: {
'Content-Type': 'application/json'
},
success(res) {
console.log('请求成功', res.data);
},
fail(err) {
console.error('请求失败', err);
},
complete() {
console.log('请求完成');
}
});
2. 注意事项
需在微信公众平台配置合法域名(本地调试可关闭校验)
默认超时时间可通过全局配置 networkTimeout 调整
支持 Promise 封装,简化异步代码
function request(options) {
return new Promise((resolve, reject) => {
wx.request({
...options,
success(res) { resolve(res.data) },
fail(err) { reject(err) }
});
});
}
// 使用
request({ url: 'https://api.example.com/data' })
.then(data => console.log(data))
.catch(err => console.error(err));
3590

被折叠的 条评论
为什么被折叠?



