文档中心
小程序 
控制台
登录
框架概述
目录结构
Native 渲染
性能与优化
小程序全局配置
ACSS 语法参考
小程序页面
小程序页面介绍
页面配置
页面结构
页面样式
页面运行机制
getCurrentPages 方法
Router
页面常见问题
Sitemap 配置
AXML
SJS 语法参考
事件系统
自定义组件
基础能力
基础库
基础库更新日志
小程序的 JavaScript 引擎
小程序场景值
场景值列表
兼容
开发 >  框架 >  小程序页面 > 页面运行机制

页面运行机制

页面运行机制
收藏
订阅更新
我的文档
设置

Page(object: Object)

/pages 目录的 .js 文件中,定义 Page(),用于注册一个小程序页面,接收一个 object 作为属性,用来指定页面的初始数据、生命周期回调、事件处理等。

以下为一个基本的页面代码:

// pages/index/index.js
Page({
  data: {
    title: 'Alipay',
  },
  onLoad(query) {
    // 页面加载
  },
  onShow() {
    // 页面显示
  },
  onReady() {
    // 页面加载完成
  },
  onHide() {
    // 页面隐藏
  },
  onUnload() {
    // 页面被关闭
  },
  onTitleClick() {
    // 标题被点击
  },
  onPullDownRefresh() {
    // 页面被下拉
  },
  onReachBottom() {
    // 页面被拉到底部
  },
  onShareAppMessage() {
    // 返回自定义分享信息
  },
  // 事件处理函数对象
  events: {
    onBack() {
      console.log('onBack');
    },
  },
  // 自定义事件处理函数
  viewTap() {
    this.setData({
      text: 'Set data for update.',
    });
  },
  // 自定义事件处理函数
  go() {
    // 带参数的跳转,从 page/ui/index 的 onLoad 函数的 query 中读取 type
    my.navigateTo({ url: '/page/ui/index?type=mini' });
  },
  // 自定义数据对象
  customData: {
    name: 'alipay',
  },
});

object 属性说明

页面数据对象 data

通过设置 data 指定页面的初始数据。

对象类型

在这种使用方式下,对 data 的原地修改会被保留下来,当页面推出再次进入该页面时,data 是被修改后的值。

函数类型

注意: 不要直接修改 this.data,无法改变页面的状态,还会造成数据不一致。例如:

页面生命周期

对于一个 page 实例来说,生命周期包含 onLoad、onShow、onReady、onHide、onUnload。分别在页面的启动过程的不同阶段,以及后续操作响应时触发,具体可以查看页面状态流转。

页面状态流转

说明: onLoad、onReady、onUnload 只会被执行一次,而 onHide、onShow 则会执行多次。

生命周期函数方法

onLoad(query: Object)

页面初始化时触发。一个页面只会调用一次。 query 来源于 my.navigateTo 和 my.redirectTo 等接口 URL 字段的参数部份(例如:path?key1=value1&key2=value2)。基础库会将该部份字符串内容解析为 Object,解析规则可查看 小程序全局 / 页面参数设置以及解析细节。

onShow()

页面显示/切入前台时触发。

onReady()

页面初次渲染完成时触发。 一个页面只会调用一次,代表页面已经准备妥当,可以和视图层进行交互。 对界面的设置,如 my.setNavigationBar 请在 onReady 之后设置。

onHide()

页面隐藏/切入后台时触发。 如 my.navigateTo 到其它页面或底部 tab 切换等。

onUnload()

页面卸载时触发。 如 my.redirectTomy.navigateBack 到其它页面等。

页面事件处理函数

onShareAppMessage(options: Object)

在 Page 中定义 onShareAppMessage 函数,设置该页面的分享信息。

开发者可通过传入参数自定义小程序分享内容(例如:标题、描述、图片),用户通过点击或者复制分享的内容可以快速打开小程序,进入指定页面。目前支持的分享渠道有:支付宝朋友动态、支付宝好友、钉钉、新浪微博、微信、QQ。

应用场景

用户点击右上角的选项按钮可以分享小程序,用户点击分享后出现若干分享的选项。

根据用户选择的不同渠道,出现不同的分享形式。

效果实例

右上角触发分享效果:

按钮触发分享方式效果:

示例代码

右上角触发分享示例代码:

按钮触发分享方式示例代码:

入参

入参是 Object 类型,参数如下:

返回值

onShareAppMessage 执行后必须返回一个分享对象,用于自定义分享内容。

success 回调函数

onTitleClick()

点击标题时触发。

onOptionMenuClick()

点击导航栏额外图标触发。

onPullDownRefresh({from: manual|code})

监听该页面的用户下拉刷新事件。

需要在 app.json 的 window 选项 中开启 "allowsBounceVertical": "YES" 且在页面的 json 文件中设置 "pullRefresh": true,页面才允许用户触发下拉刷新。

from 的值为 code 表示 startPullDownRefresh 触发的事件; 为 manual 表示用户下拉触发的下拉事件。

注意:安卓客户端 10.5.6 版本之前,安卓环境下通过代码和手势触发下拉刷新的结果都是 manual。建议在调用 my.startPullDownRefresh() 方法时,设置一个标志来区分这两种触发方式,并在若干毫秒后自动清除该标志。

onTabItemTap(object: Object)

目标页面监听 tabBar 的点击事件,切换 tabItem 时触发。

注意:首次打开目标页面时,onTabItemTap 会在目标页面 onShow 后触发。重新回到目标页面时,onTabItemTap 会在目标页面 onShow 前触发。

onPageScroll(object: Object)

页面滚动时触发。

onReachBottom()

上拉触底时触发。 onReachBottom()是在上拉触底时才会触发,如果页面已经在页面底部继续上拉是不会再次触发。可以配合 my.pageScrollTo 向上滚动一点位置或者在底部增加数据等方式让页面不是处在底部位置达到可以连续上拉触发 onReachBottom()的效果。

events

Page 配置对象中新增以 on 为前缀的事件会引入潜在的问题(可能造成业务逻辑的错误触发),因此除上述基础事件外,新增的事件统一收敛到 Page.events 对象中定义和管理。出于向前兼容考虑,之前的所有事件一般会在 Page.onXXPage.events.onXX 均支持。

自基础库 2.8.6 开始,支持在 Component 通过 rootEvents 参数在组件中监听组件所在页面的生命周期函数以及页面事件处理函数。Component.rootEvents 支持的事件列表与 Page.events 相同。

注意:

以下是 Page.events / Component.rootEvents 支持的事件函数列表:

beforeReload(event: Object)

页面重载前触发,常见于 WKWebView 崩溃与恢复。当页面发生重载时,现有的页面和自定义组件实例会被销毁,而后新建。通过此事件可以将一些销毁前的状态保存下来,传递给新建的页面和自定义组件。

说明:状态对象在页面及其自定义组件之间共享。如有特殊需求,请留意宿主小程序页面和插件自定义组件之间的数据隔离,或者同字段值被覆盖的可能性。

示例代码

beforeTabItemTap()

点击非当前 tabItem 前触发。

onKeyboardHeight(object: Object)

键盘高度变化时触发。

onBack()

导航栏左侧返回按钮(以及 Android 系统返回键)被点击时触发。

onResize(object: Object)

window 尺寸改变时触发。

size 属性说明

onSelectedTabItemTap(object: Object)

点击当前 tabItem 后触发。

示例代码

// 特征检测
my.canIUse('page.events.onBack');
Page({
  data: {
    text: 'This is page data.',
  },
  onLoad() {
    // 页面加载时触发
  },
  events: {
    onBack() {
      // 导航栏左侧返回按钮(以及 Android 系统返回键)被点击时触发
    },
    onKeyboardHeight(e) {
      // 键盘高度变化时触发
      console.log('键盘高度:', e.height);
    },
    onOptionMenuClick() {
      // 点击右上角菜单按钮触发
    },
    onPullDownRefresh(e) {
      // 页面下拉时触发。e.from的值是“code”表示startPullDownRefresh触发的事件;值是“manual”表示用户下拉触发的下拉事件
      console.log('触发下拉刷新的类型', e.from);
      my.stopPullDownRefresh();
    },
    onTitleClick() {
      // 点击标题触发
    },
    onTabItemTap(e) {
      // 点击非当前tabItem后触发
      // e.from是点击且切换tabItem后触发,值是“user”表示用户点击触发的事件;值是“api”表示switchTab触发的事件
      console.log('触发tab变化的类型', e.from);
      console.log('点击的tab对应页面的路径', e.pagePath);
      console.log('点击的tab的文字', e.text);
      console.log('点击的tab的索引', e.index);
    },
    beforeTabItemTap() {
      // 点击但切换tabItem前触发
    },
    onSelectedTabItemTap(e) {
      // 点击当前tabItem后触发
      console.log('点击的tab对应页面的路径', e.pagePath);
      console.log('点击的tab的文字', e.text);
      console.log('点击的tab的索引', e.index);
    },
    onResize(e) {
      // window尺寸改变时触发
      var { windowWidth, windowHeight } = e.size;
      console.log('改变后window的宽度', windowWidth);
      console.log('改变后window的高度', windowHeight);
    },
  },
});

页面实例方法

setData(data: Object, callback: Function)

setData 会将数据从逻辑层发送到视图层,同时改变对应的 this.data 的值。 Objectkey: value 的形式表示,将 this.data 中的 key 对应的值改变成 value。其中 key 可以非常灵活,以数据路径的形式给出,如 array[2].messagea.b.c.d,可以不需要在 this.data 中预先定义。

使用过程中,需要注意以下几点:

示例代码

参数说明

$spliceData(data: Object, callback: Function)

说明:$spliceData 自 1.7.2 之后才支持,可以使用 my.canIUse('page.$spliceData') 做兼容性处理,可查看 兼容。

spliceData 同样用于将数据从逻辑层发送到视图层,但是相比于 setData,在处理长列表的时候,其具有更高的性能。

Objectkey: value 的形式表示,将 this.data 中的 key 对应的值改变成 value。其中 key 可以非常灵活,以数据路径的形式给出,如 array[2].messagea.b.c.d,可以不需要在 this.data 中预先定义。value 为一个数组(格式:[start, deleteCount, ...items]), 数组的第一个元素为操作的起始位置,第二个元素为删除的元素的个数,剩余的元素均为插入的数据。对应 es5 中数组的 splice 方法。

示例代码

页面输出

参数说明

$batchedUpdates(callback: Function)

批量更新数据。

说明$batchedUpdates 自 1.14.0 之后才支持,可以使用 my.canIUse('page.$batchedUpdates') 做兼容性处理,可查看 兼容。

参数说明

示例代码

createSelectorQuery

创建 SelectorQuery 对象实例,查找定义在页面 .axml 中的节点。支持基础库 2.7.4 及以上版本。可用性判断:

与 my.createSelectorQuery 的区别是:

createIntersectionObserver

创建 IntersectionObserver 对象实例,检测定义在页面 .axml 中的节点。支持基础库 2.7.4 及以上版本。

Native 渲染引擎:暂不支持。

可用性判断:

与 my.createIntersectionObserver 的区别是:

createMediaQueryObserver

创建 MediaQueryObserver 对象实例,用于监听页面 media query 状态的变化。支持基础库 2.8.2 及以上版本。

Native 渲染引擎:暂不支持。

可用性判断:

getOpenerEventChannel

基础库 2.7.7 起支持。如果一个页面由另一个页面通过 my.navigateTo 打开,这两个页面间将建立一条通信通道:

这两个 EventChannel 对象间可以使用 emiton 方法相互发送、监听事件。

getTabBar

获取自定义 tabBar 实例,参照 自定义 tabBar。基础库 2.7.20 起支持。

hasMixin

检查页面是否具有 mixin。基础库 2.8.5 开始支持。

setUpdatePerformanceListener

设置更新性能统计信息接收函数,详情可查看 获取更新性能统计信息。基础库 2.8.5 开始支持。

getSavedReloadState

获取页面重载前的状态对象。详见 beforeReload 事件。

页面实例属性

route

Page 路径,对应 app.json 中配置的路径值,类型为 String。这是一个只读属性。

router

页面路由器对象,有 switchTab、 reLaunch 、redirectTo、 navigateTo、 navigateBack 五个方法。可以通过 this.pageRouter 或 this.router 获得当前页面的路由器对象。基础库 2.7.22 起支持。

天下网标王济南关键词排名哪家好达州网站设计哪家好昌都百度seo黔东南SEO按天计费多少钱驻马店百度竞价哪家好鸡西SEO按天计费坪地推广网站多少钱孝感SEO按天计费报价兰州seo排名多少钱东营关键词排名哪家好衢州关键词按天扣费多少钱宜宾网站关键词优化推荐扬州网站开发多少钱塔城网站建设多少钱六安推广网站推荐孝感网站推广方案公司延安网络营销哪家好松岗百度网站优化排名哪家好黄石网站设计朝阳网站改版十堰网站优化按天收费哪家好丽水网站设计公司襄阳网站推广公司南京seo网站优化松岗seo公司连云港至尊标王价格宿迁关键词按天计费淮南阿里店铺运营公司宜春网站推广方案哪家好民治网站优化按天计费哪家好香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

天下网标王 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化