小程序开发文档 Page · setData · 生命周期

脚本运行时

每个页面拥有独立的 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 绑定。 事件对象包含:

字段说明
typetap / change / input / confirm
timeStamp事件派发时间(毫秒)
target.dataset / currentTarget.datasetdata-* 属性集合
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。