# 视图层(WXML / WXSS / WXS)
> 官方文档:https://developers.weixin.qq.com/miniprogram/dev/framework/view/
## WXML — 模板语法
### 数据绑定
```xml
{{ message }}
{{ a + b }} + {{ c }} + d
{{"hello " + name}}
{{object.key}} {{array[0]}}
Hidden
{{item}}
```
### 列表渲染 wx:for
```xml
{{index}}: {{item.message}}
{{idx}}: {{itemName.message}}
{{i}} * {{j}} = {{i * j}}
{{item.id}}
{{item}}
```
**wx:key 的作用**:当数据改变触发重新渲染时,带有 key 的组件会被重新排序而非重新创建,保持自身状态(如 `` 的输入内容、`` 的选中状态)。
### 条件渲染
```xml
1
2
3
view1
view2
```
**wx:if vs hidden**:
- `wx:if` 是惰性的,条件为 false 时不渲染,切换时销毁/重建
- `hidden` 始终渲染,只是切换显示/隐藏(类似 CSS display:none)
- 频繁切换用 `hidden`,运行时条件不大可能改变用 `wx:if`
### 模板 template
```xml
{{index}}: {{msg}}
Time: {{time}}
```
### 引用
```xml
body
```
## WXSS — 样式
### rpx 单位
rpx(responsive pixel):可以根据屏幕宽度进行自适应。规定屏幕宽为 750rpx。
| 设备 | rpx 换算 px | px 换算 rpx |
|------|------------|------------|
| iPhone5 | 1rpx = 0.42px | 1px = 2.34rpx |
| iPhone6 | 1rpx = 0.5px | 1px = 2rpx |
| iPhone6 Plus | 1rpx = 0.552px | 1px = 1.81rpx |
**建议**:开发时以 iPhone6 为视觉稿标准(750px 宽),1px = 1rpx。
### 样式导入
```css
/* common.wxss */
.small-p { padding: 5px; }
/* app.wxss */
@import "common.wxss";
.middle-p { padding: 15px; }
```
### 选择器支持
| 选择器 | 示例 | 说明 |
|--------|------|------|
| .class | `.intro` | 类选择器 |
| #id | `#firstname` | ID 选择器 |
| element | `view` | 元素选择器 |
| element, element | `view, checkbox` | 群组选择器 |
| ::after | `view::after` | 伪元素 |
| ::before | `view::before` | 伪元素 |
### 内联样式
```xml
```
### 全局样式与局部样式
- `app.wxss` 为全局样式,作用于每个页面
- 页面的 `.wxss` 只对当前页面生效,会覆盖 `app.wxss` 中相同的选择器
## WXS(WeiXin Script)
WXS 是小程序的一套脚本语言,可以在 WXML 中使用。**WXS 运行在视图层**,比 JS 逻辑层快(不需要跨线程通信)。
```xml
var msg = "hello world";
module.exports.message = msg;
{{m1.message}}
{{tools.msg}}
{{tools.bar(tools.FOO)}}
```
```javascript
// tools.wxs
var foo = "'hello world' from tools.wxs"
var bar = function(d) {
return d
}
module.exports = {
FOO: foo,
bar: bar,
}
// ⚠️ WXS 不支持 ES6 语法(箭头函数、let/const、解构等)
// ⚠️ WXS 中不能调用小程序 API(wx.xxx)
```
**WXS 典型用途**:
- 格式化数据(日期、金额、文本截断)
- 在视图层做简单计算,避免 setData 开销
- 响应事件(WXS 事件响应,iOS 上性能更好)
## 事件系统
### 事件分类
| 类型 | 说明 | 示例 |
|------|------|------|
| 冒泡事件 | 向父节点传递 | tap, longpress, touchstart, touchmove, touchend, touchcancel |
| 非冒泡事件 | 不向父节点传递 | submit, input, scroll 等组件特有事件 |
### 事件绑定
```xml
Click me
Click me
Click me
inner
inner(不会触发)
```
### 事件对象
```javascript
Page({
handleTap(e) {
e.type // 事件类型,如 "tap"
e.timeStamp // 事件生成时的时间戳
e.target // 触发事件的源组件(可能是子组件)
e.currentTarget // 事件绑定的当前组件
e.detail // 额外信息,如 tap 的 { x, y }
e.touches // 触摸事件的触摸点信息数组
e.changedTouches // 变化的触摸点信息数组
e.mark // 事件标记(基础库 2.7.1+)
// target 和 currentTarget 的区别
e.target.id // 触发事件的组件 id
e.target.dataset // 触发事件的组件的 data-xxx 属性集合
e.currentTarget.id // 绑定事件的组件 id
e.currentTarget.dataset
}
})
```
### dataset
```xml
Click
```
```javascript
handleTap(e) {
e.currentTarget.dataset.alphaBeta // "1"(连字符转驼峰)
e.currentTarget.dataset.alphabeta // "2"(大写转小写)
}
```
### mark(基础库 2.7.1+)
```xml
```
```javascript
bindButtonTap(e) {
e.mark // { myMark: "last", anotherMark: "leaf" }
// mark 会合并冒泡路径上所有的 mark
}
```
## 在线查询
如需更详细信息,可抓取:
- WXML 语法:https://developers.weixin.qq.com/miniprogram/dev/reference/wxml/
- WXSS:https://developers.weixin.qq.com/miniprogram/dev/framework/view/wxss.html
- WXS:https://developers.weixin.qq.com/miniprogram/dev/reference/wxs/
- 事件:https://developers.weixin.qq.com/miniprogram/dev/framework/view/wxml/event.html