欢迎您的光临,本博所发布之文章皆为作者亲测通过,如有错误,欢迎通过各种方式指正。

教程  微信小程序之注册程序App()和注册页面Page()函数

小程序应用 本站 1281 0评论

微信小程序框架的逻辑层是由JavaScript编写的,逻辑层将数据进行处理后发送给视图层,同时接受视图层的事件反馈。

App进行程序注册,Page进行页面注册

getApp获取App实例,getCurrentPages获取当前页面栈


一、用App注册小程序


在app.js提供了App()函数用来注册一个小程序。接受一个object参数,其指定小程序的生命周期函数等。

object参数说明:

属性类型描述触发时机
onLaunchFunction生命周期函数--监听小程序初始化当小程序初始化完成时,会触发 onLaunch(全局只触发一次)
onShowFunction生命周期函数--监听小程序显示当小程序启动,或从后台进入前台显示,会触发 onShow
onHideFunction生命周期函数--监听小程序隐藏当小程序从前台进入后台,会触发 onHide
onErrorFunction错误监听函数当小程序发生脚本错误,或者 api 调用失败时,会触发 onError 并带上错误信息
onPageNotFoundFunction页面不存在监听函数当小程序出现要打开的页面不存在的情况,会带上页面信息回调该函数,详见下文
其他Any 开发者可以添加任意的函数或数据到 Object 参数中,用 this 可以访问

前台、后台定义:当用户点击左上角关闭,或者按了设备 Home 键离开微信,小程序并没有直接销毁,而是进入了后台;当再次进入微信或再次打开小程序,又会从后台进入前台。需要注意的是:只有当微信小程序进入后台一定时间,或者系统资源占用过高,才会被真正的销毁。

关闭小程序(基础库版本1.1.0开始支持):当用户从扫一扫、转发等入口(场景值为1007, 1008, 1011, 1025)进入小程序,且没有置顶小程序的情况下退出,微信小程序会被销毁。微信小程序运行机制在基础库版本 1.4.0 有所改变:上一条关闭逻辑在新版本已不适用, 详情


示例代码:

App({
  onLaunch: function(options) { 
    // Do something initial when launch.
  },
  onShow: function(options) {
      // Do something when show.
  },
  onHide: function() {
      // Do something when hide.
  },
  onError: function(msg) {
    console.log(msg)
  },
  globalData: 'I am global data'
})


onLaunch(Object)

小程序初始化完成时触发,全局只触发一次。参数也可以使用 wx.getLaunchOptionsSync 获取。


onShow(Object)

小程序启动,或从后台进入前台显示时触发。也可以使用 wx.onAppShow 绑定监听。


onLaunch, onShow 参数

字段类型说明
pathString打开小程序的路径
queryObject打开小程序的query
sceneNumber打开小程序的场景值
shareTicketStringshareTicket,详见 获取更多转发信息
referrerInfoObject当场景为由另一个小程序打开时,返回此字段
referrerInfo.appIdString来源小程序的 appId
referrerInfo.extraDataObject来源小程序传过来的数据


onHide()

小程序从前台进入后台时触发。也可以使用 wx.onAppHide 绑定监听。


onError(String error)

小程序发生脚本错误或 API 调用报错时触发。也可以使用 wx.onError 绑定监听。


function callback 小程序错误事件的回调函数

参数

string    error

错误信息,包含堆栈


onPageNotFound(Object)

基础库 1.9.90 开始支持,低版本需做兼容处理。

小程序要打开的页面不存在时触发。也可以使用 wx.onPageNotFound 绑定监听。

参数:

wx.onPageNotFound 一致

字段类型说明
pathString不存在页面的路径
queryObject打开不存在页面的 query
isEntryPageBoolean是否本次启动的首个页面(例如从分享等入口进来,首个页面是开发者配置的分享页面)

开发者可以在 onPageNotFound 回调中进行重定向处理,但必须在回调中同步处理,异步处理(例如 setTimeout 异步执行)无效。

示例代码:

App({
  onPageNotFound(res) {
    wx.redirectTo({
      url: 'pages/...'
    }) // 如果是 tabbar 页面,请使用 wx.switchTab
  }
})

注意:

· 微信开发者工具暂不支持 onPageNotFound 调试,请使用真机调试

· 如果开发者没有添加 onPageNotFound 监听,当跳转页面不存在时,将推入微信客户端原生的页面不存在提示页面

· 如果 onPageNotFound 回调中又重定向到另一个不存在的页面,将推入微信客户端原生的页面不存在提示页面,并且不在回调 onPageNotFound


getApp(Object)

我们提供了全局的getApp()函数,可以获取到小程序实例。

如:

// other.js

var appInstance = getApp()

console.log(appInstance.globalData)


注意:

· App() 必须在 app.js 中注册,且不能注册多个。

· 不要在定义于 App() 内的函数中调用 getApp() ,使用 this 就可以拿到 app 实例。

· 不要在 onLaunch 的时候调用 getCurrentPage(),此时 page 还没有生成。

· 通过 getApp() 获取实例之后,不要私自调用生命周期函数。


、用Page注册页面


Page() 函数用来注册一个页面。接受一个 object 参数,其指定页面的初始数据、生命周期函数、事件处理函数等。Page()方法每个页面有且仅有一个,存在于该页面的.js文件中。

object参数说明:

属性类型描述
dataObject页面的初始数据
onLoadFunction生命周期函数--监听页面加载
onReadyFunction生命周期函数--监听页面初次渲染完成
onShowFunction生命周期函数--监听页面显示
onHideFunction生命周期函数--监听页面隐藏
onUnloadFunction生命周期函数--监听页面卸载
onPullDownRefreshFunction页面相关事件处理函数--监听用户下拉动作
onReachBottomFunction页面上拉触底事件的处理函数
onShareAppMessageFunction用户点击右上角分享
其他Any开发者可以添加任意的函数或数据到 object 参数中,在页面的函数中用 this可以访问


示例代码:

//index.js
Page({
  data: {
    text: "This is page data."
  },
  onLoad: function(options) {
    // Do some initialize when page load.
  },
  onReady: function() {
    // Do something when page ready.
  },
  onShow: function() {
    // Do something when page show.
  },
  onHide: function() {
    // Do something when page hide.
  },
  onUnload: function() {
    // Do something when page close.
  },
  onPullDownRefresh: function() {
    // Do something when pull down.
  },
  onReachBottom: function() {
    // Do something when page reach bottom.
  },
  onShareAppMessage: function () {
   // return custom share data when user share.
  },
  // Event handler.
  viewTap: function() {
    this.setData({
      text: 'Set some data for updating view.'
    })
  },
  customData: {
    hi: 'MINA'
  }
})


初始化数据


初始化数据将作为页面的第一次渲染。data 将会以 JSON 的形式由逻辑层传至渲染层,所以其数据必须是可以转成 JSON 的格式:字符串,数字,布尔值,对象,数组。

渲染层可以通过 WXML 对数据进行绑定。


示例代码:

<view>{{text}}</view>
<view>{{array[0].msg}}</view>
Page({
  data: {
    text: 'init data',
    array: [{msg: '1'}, {msg: '2'}]
  }
})


··· 生命周期函数 ···


onLoad(Object query): 页面加载

一个页面只会调用一次。

接收页面参数可以获取wx.navigateTo和wx.redirectTo及<navigator/>中的 query。


onShow: 页面显示

每次打开页面都会调用一次。


onReady: 页面初次渲染完成

一个页面只会调用一次,代表页面已经准备妥当,可以和视图层进行交互。

对界面的设置如wx.setNavigationBarTitle请在onReady之后设置。详见生命周期


onHide: 页面隐藏

当navigateTo或底部tab切换时调用。


onUnload: 页面卸载

当redirectTo或navigateBack的时候调用。


··· 页面事件处理函数 ···


onPullDownRefresh() 监听用户下拉刷新事件。

· 需要在app.json的window选项中或页面配置中开启enablePullDownRefresh。

· 可以通过wx.startPullDownRefresh触发下拉刷新,调用后触发下拉刷新动画,效果与用户手动下拉刷新一致。

· 当处理完数据刷新后,wx.stopPullDownRefresh可以停止当前页面的下拉刷新。


onReachBottom() 监听用户上拉触底事件。

· 可以在app.json的window选项中或页面配置中设置触发距离onReachBottomDistance。

· 在触发距离内滑动期间,本事件只会被触发一次。


onPageScroll(Object) 监听用户滑动页面事件。

Object 参数说明:

111.jpg

注意:请只在需要的时候才在 page 中定义此方法,不要定义空方法。以减少不必要的事件派发对渲染层-逻辑层通信的影响。 注意:请避免在 onPageScroll 中过于频繁的执行 setData 等引起逻辑层-渲染层通信的操作。尤其是每次传输大量数据,会影响通信耗时。


onShareAppMessage: 用户分享

· 只有定义了此事件处理函数,右上角菜单才会显示“分享”按钮

· 用户点击分享按钮的时候会调用

· 此事件需要 return 一个 Object,用于自定义分享内容


Object 参数说明:

222.jpg

自定义分享字段:

字段说明默认值
title分享标题当前小程序名称
desc分享描述当前小程序名称
path分享路径当前页面 path ,必须是以 / 开头的完整路径


示例代码:

Page({
  onShareAppMessage: function () {
    return {
      title: '自定义分享标题',
      desc: '自定义分享描述',
      path: '/page/user?id=123'
    }
  }


··· 事件处理函数 ···


除了初始化数据和生命周期函数,Page 中还可以定义一些特殊的函数:事件处理函数。在渲染层可以在组件中加入事件绑定,当达到触发事件时,就会执行 Page 中定义的事件处理函数。


示例代码:

<view bindtap="viewTap"> click me </view>
Page({
  viewTap: function() {
    console.log('view tap')
  }
})


Page.prototype.setData()

setData 函数用于将数据从逻辑层发送到视图层,同时改变对应的 this.data 的值。

参数:

333.jpg

Object 以 key: value 的形式表示,将 this.data 中的 key 对应的值改变成 value。

其中 key 可以以数据路径的形式给出,支持改变数组中的某一项或对象的某个属性,如 array[2].message,a.b.c.d,并且不需要在 this.data 中预先定义。


注意:

· 直接修改 this.data 无效,无法改变页面的状态,还会造成数据不一致。

· 单次设置的数据不能超过1024kB,请尽量避免一次设置过多的数据。

· setData() 参数格式

· 接受一个对象,以 key,value 的形式表示将 this.data 中的 key 对应的值改变成 value。


示例代码:

<!--index.wxml-->
<view>{{text}}</view>
<button bindtap="changeText"> Change normal data </button>
<view>{{array[0].text}}</view>
<button bindtap="changeItemInArray"> Change Array data </button>
<view>{{object.text}}</view>
<button bindtap="changeItemInObject"> Change Object data </button>
<view>{{newField.text}}</view>
<button bindtap="addNewField"> Add new data </button>


//index.js
Page({
  data: {
    text: 'init data',
    array: [{text: 'init data'}],
    object: {
      text: 'init data'
    }
  },
  changeText: function() {
    // this.data.text = 'changed data'  // bad, it can not work
    this.setData({
      text: 'changed data'
    })
  },
  changeItemInArray: function() {
    // you can use this way to modify a danamic data path
    this.setData({
      'array[0].text':'changed data'
    })
  },
  changeItemInObject: function(){
    this.setData({
      'object.text': 'changed data'
    });
  },
  addNewField: function() {
    this.setData({
      'newField.text': 'new data'
    })
  }
})


getCurrentPages()

getCurrentPages() 函数用于获取当前页面栈的实例,以数组形式按栈的顺序给出,第一个元素为首页,最后一个元素为当前页面。


Tip:不要尝试修改页面栈,会导致路由以及页面状态错误。


三、页面栈


框架以栈的形式维护了当前的所有页面。 当发生路由切换的时候,页面栈的表现如下:


路由方式页面栈表现
初始化新页面入栈
打开新页面新页面入栈
页面重定向当前页面出栈,新页面入栈
页面返回页面不断出栈,直到目标返回页,新页面入栈
Tab 切换页面全部出栈,只留下新的 Tab 页面


四、生命周期


下图说明了 Page 实例的生命周期。

123.jpg


在小程序中所有页面的路由全部由框架进行管理,对于路由的触发方式以及页面生命周期函数如下:

路由方式触发时机路由后页面路由前页面
初始化小程序打开的第一个页面onLoad,onShow
打开新页面调用 API wx.navigateTo 或使用组件 <navigator open-type="navigate"/>onLoad,onShowonHide
页面重定向调用 API wx.redirectTo 或使用组件 <navigator open-type="redirect"/>onLoad,onShowonUnload
页面返回调用 API wx.navigateBack 或用户按左上角返回按钮onShowonUnload(多层页面返回每个页面都会按顺序触发onUnload)
Tab 切换调用 API wx.switchTab 或使用组件 <navigator open-type="switchTab"/> 或用户切换 Tab
各种情况请参考下表

Tab 切换对应的生命周期(以 A、B 页面为 Tabbar 页面,C 是从 A 页面打开的页面,D 页面是从 C 页面打开的页面为例):

当前页面路由后页面触发的生命周期(按顺序)
AANothing happend
ABA.onHide(), B.onLoad(), B.onShow()
AB(再次打开)A.onHide(), B.onShow()
CAC.onUnload(), A.onShow()
CBC.onUnload(), B.onLoad(), B.onShow()
DBD.onUnload(), C.onUnload(), B.onLoad(), B.onShow()
D(从分享进入)AD.onUnload(), A.onLoad(), A.onShow()
D(从分享进入)BD.onUnload(), B.onLoad(), B.onShow()

Bug & Tip

bug: iOS/Android 6.3.30, 首次进入页面,如果页面不满一屏时会触发 onReachBottom ,应为只有用户主动上拉才触发;

bug: iOS/Android 6.3.30, 手指上拉,会触发多次 onReachBottom ,应为一次上拉,只触发一次;


五、文件作用域


在 JavaScript 文件中声明的变量和函数只在该文件中有效;不同的文件中可以声明相同名字的变量和函数,不会互相影响。

通过全局函数 getApp() 可以获取全局的应用实例,如果需要全局的数据可以在 App() 中设置,如:

// app.js
App({
  globalData: 1
})
// a.js
// The localValue can only be used in file a.js.
const localValue = 'a'
// Get the app instance.
const app = getApp()
// Get the global data and change it.
app.globalData++
// b.js
// You can redefine localValue in file b.js, without interference with the localValue in a.js.
const localValue = 'b'
// If a.js it run before b.js, now the globalData shoule be 2.
console.log(getApp().globalData)


六、模块化


我们可以将一些公共的代码抽离成为一个单独的 js 文件,作为一个模块。模块只有通过 module.exports 或者 exports 才能对外暴露接口。


需要注意的是:

· exports 是 module.exports 的一个引用,因此在模块里边随意更改 exports 的指向会造成未知的错误。所以我们更推荐开发者采用 module.exports 来暴露模块接口,除非你已经清晰知道这两者的关系。

· 小程序目前不支持直接引入 node_modules , 开发者需要使用到 node_modules 时候建议拷贝出相关的代码到小程序的目录中。

// common.jsfunction sayHello(name) {  console.log(`Hello ${name} !`)
}function sayGoodbye(name) {  console.log(`Goodbye ${name} !`)
}module.exports.sayHello = sayHello
exports.sayGoodbye = sayGoodbye


在需要使用这些模块的文件中,使用 require(path) 将公共代码引入

var common = require('common.js')
Page({
  helloMINA: function() {
    common.sayHello('MINA')
  },
  goodbyeMINA: function() {
    common.sayGoodbye('MINA')
  }
})

tip: require 暂时不支持绝对路径


参考网址:

https://developers.weixin.qq.com/miniprogram/dev/framework/app-service/app.html 

https://developers.weixin.qq.com/miniprogram/dev/framework/app-service/page.html 

https://blog.csdn.net/bihansheng2010/article/details/54632483 


转载请注明: ITTXX.CN--分享互联网 » 微信小程序之注册程序App()和注册页面Page()函数

最后更新:2020-04-18 00:28:46

赞 (11) or 分享 ()
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽