脚本运行时
每个页面拥有独立的 QuickJS 上下文,页面打开时执行一次 index.js,
之后保持常驻。数据更新通过 setData 合并,容器在下一次绘制时重建节点树。
Page 与 App
// app.js
App({
onLaunch(options) { console.log('launch', options.path); },
globalData: { token: '' }
});
// pages/index/index.js
Page({
data: {
count: 0,
user: { name: 'Nova' }
},
onLoad(query) {
// 页面首次创建,query 来自 URL
},
onShow() {},
onReady() {},
onHide() {},
onUnload() {},
onAdd() {
this.setData({ count: this.data.count + 1 });
}
});
getApp() 返回 App 实例,getCurrentPages() 返回当前页面路径数组。
页面对象上的方法与生命周期都以 this 指向页面本身。
生命周期顺序
| 阶段 | 回调 | 触发时机 |
|---|---|---|
| 创建 | onLoad(query) | 页面实例创建后,查询参数已解析 |
| 显示 | onShow() | onLoad 之后;从后台或子页面返回时再次触发 |
| 渲染完成 | onReady() | 首次布局与绘制完成后,只触发一次 |
| 隐藏 | onHide() | navigateTo 压入新页面时 |
| 销毁 | onUnload() | navigateBack / redirectTo / reLaunch 移除页面时 |
setData
setData(patch) 把补丁递归合并进 this.data,随后标记页面脏并在下一帧重绘。
支持普通对象、数组以及点路径键:
this.setData({ count: 3 });
this.setData({ 'user.name': 'Mika' });
this.setData({ list: this.data.list.concat('new') });
// 读取
console.log(this.data.user.name);
this.data 再调用 setData 不会自动生效,
请始终把变更放进 setData 参数。
定时器
setTimeout、setInterval、clearTimeout、
clearInterval 由容器每帧推进,页面销毁时自动清理。
this.timer = setInterval(() => {
this.setData({ count: this.data.count + 1 });
}, 2000);
onUnload() {
clearInterval(this.timer);
}
事件处理
事件回调通过 bindtap / bindchange /
bindinput / bindconfirm 绑定。
事件对象包含:
| 字段 | 说明 |
|---|---|
type | tap / change / input / confirm |
timeStamp | 事件派发时间(毫秒) |
target.dataset / currentTarget.dataset | data-* 属性集合 |
target.id | 元素 id |
detail.value | 表单组件的值 |
<button data-id="7" bindtap="onItem">选择</button>
onItem(event) {
this.setData({ selected: event.currentTarget.dataset.id });
}
页面按键事件
在页面对象上定义 onKeyDown(event) 可以接收 Switch 手柄按键。
event.key 取值为 up / down / left /
right / a / b。
回调返回 true 表示已消费该按键,容器不再执行默认的焦点移动、
确认激活或返回逻辑;返回其他值时按原行为处理。
Page({
onKeyDown(event) {
if (event.key === 'left' || event.key === 'right') {
this.switchChannel(event.key === 'left' ? -1 : 1);
return true; // 方向键不再移动焦点
}
return false; // A / B 交给容器默认处理
}
});
wx.getSystemInfoSync().keyEvents 判断,缺失时回退到按钮操作。
运行在全屏视频时按键同样会触发,B 键默认仍是退出全屏 / 返回。
Promise 与异步
QuickJS 原生支持 async / await、Promise 与
JSON。每次回调结束后容器会清空微任务队列,因此
Promise.then 会在同一帧内执行。没有 require /
import,所有代码需写在页面文件或 app.js 中。
错误处理
生命周期或事件回调抛出异常时,容器会捕获并写入宿主日志, 页面中央显示红色错误文字。未捕获的 Promise 拒绝不会中断页面。
client/apps/miniapp/source/js_runtime.cpp。