小程序框架之逻辑层App Service-程序员宅基地

技术标签: ViewUI  javascript  

小程序开发框架的逻辑层使用 JavaScript 引擎为小程序提供开发者 JavaScript 代码的运行环境以及微信小程序的特有功能。

逻辑层将数据进行处理后发送给视图层,同时接受视图层的事件反馈。

 

开发者写的所有代码最终将会打包成一份 JavaScript 文件,并在小程序启动的时候运行,直到小程序销毁。这一行为类似 ServiceWorker,所以逻辑层也称之为 App Service。

    在 JavaScript 的基础上,我们增加了一些功能,以方便小程序的开发:

  • 增加 App 和 Page 方法,进行程序注册页面注册
  • 增加 getApp 和 getCurrentPages 方法,分别用来获取 App 实例和当前页面栈。
  • 提供丰富的 API,如微信用户数据,扫一扫,支付等微信特有能力。
  • 提供模块化能力,每个页面有独立的作用域

    注意:小程序框架的逻辑层并非运行在浏览器中,因此 JavaScript 在 web 中一些能力都无法使用,如 windowdocument 等。

 

(1)注册小程序

     每个小程序都需要在 app.js 中调用 App 方法注册小程序示例,绑定生命周期回调函数、错误监听和页面不存在监听函数等。

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

    整个小程序只有一个 App 实例,是全部页面共享的。开发者可以通过 getApp 方法获取到全局唯一的 App 示例,获取App上的数据或调用开发者注册在 App 上的函数。

// xxx.js
const appInstance = getApp()
console.log(appInstance.globalData) // I am global data

App(Object object)

注册小程序。接受一个 Object 参数,其指定小程序的生命周期回调等。

App() 必须在 app.js 中调用,必须调用且只能调用一次。不然会出现无法预期的后果。

参数
Object object
属性 类型 默认值 必填 说明
onLaunch function   生命周期回调——监听小程序初始化。
onShow function   生命周期回调——监听小程序启动或切前台。
onHide function   生命周期回调——监听小程序切后台。
onError function   错误监听函数。
onPageNotFound function   页面不存在监听函数。
其他 any   开发者可以添加任意的函数或数据变量到 Object参数中,用 this 可以访问

关于小程序前后台的定义和小程序的运行机制,请参考运行机制章节。

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

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

参数:与 wx.getLaunchOptionsSync 一致

onShow(Object object)

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

参数:与 wx.onAppShow 一致

onHide()

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

onError(String error)

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

参数:与 wx.onError 一致

onPageNotFound(Object object)

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

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

参数:与 wx.onPageNotFound 一致

示例代码:

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

 

 

(2)注册页面

    对于小程序中的每个页面,都需要在页面对应的 js 文件中调用 Page 方法注册页面示例,指定页面的初始数据、生命周期回调、事件处理函数等。

    Page(Object object)---->注册小程序中的一个页面。接受一个 Object 类型参数,其指定页面的初始数据、生命周期回调、事件处理函数等。

属性 类型 说明
data Object 页面的初始数据
onLoad function 生命周期回调—监听页面加载
onShow function 生命周期回调—监听页面显示
onReady function 生命周期回调—监听页面初次渲染完成
onHide function 生命周期回调—监听页面隐藏
onUnload function 生命周期回调—监听页面卸载
onPullDownRefresh function 监听用户下拉动作
onReachBottom function 页面上拉触底事件的处理函数
onShareAppMessage function 用户点击右上角转发
onPageScroll function 页面滚动触发事件的处理函数
onResize function 页面尺寸改变时触发,详见 响应显示区域变化
onTabItemTap function 当前是 tab 页时,点击 tab 时触发
其他 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.
  },
  onPageScroll: function() {
    // Do something when page scroll
  },
  onResize: function() {
    // Do something when page resize
  },
  onTabItemTap(item) {
    console.log(item.index)
    console.log(item.pagePath)
    console.log(item.text)
  },
  // Event handler.
  viewTap: function() {
    this.setData({
      text: 'Set some data for updating view.'
    }, function() {
      // this is setData callback
    })
  },
  customData: {
    hi: 'MINA'
  }
})

    除了 Page ,作为高级用法,页面可以像自定义组件一样使用 Component 来创建,这样就可以使用自定义组件的特性,如 behaviors 等。

 

(3)生命周期

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

    

 

 

(4)页面路由

     在小程序中所有页面的路由全部由框架进行管理。

    ①页面栈

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

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

    开发者可以使用 getCurrentPages() 函数获取当前页面栈。

    ②路由方式

    对于路由的触发方式以及页面生命周期函数如下:

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

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

当前页面 路由后页面 触发的生命周期(按顺序)
A A Nothing happend
A B A.onHide(), B.onLoad(), B.onShow()
A B(再次打开) A.onHide(), B.onShow()
C A C.onUnload(), A.onShow()
C B C.onUnload(), B.onLoad(), B.onShow()
D B D.onUnload(), C.onUnload(), B.onLoad(), B.onShow()
D(从转发进入) A D.onUnload(), A.onLoad(), A.onShow()
D(从转发进入) B D.onUnload(), B.onLoad(), B.onShow()

Tips:

    • navigateToredirectTo 只能打开非 tabBar 页面。
    • switchTab 只能打开 tabBar 页面。
    • reLaunch 可以打开任意页面。
    • 页面底部的 tabBar 由页面决定,即只要是定义为 tabBar 的页面,底部都有 tabBar。
    • 调用页面路由带的参数可以在目标页面的onLoad中获取。

 

(5)模块化

    ①模块化值代码导入导出

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

    注意:

  • exports 是 module.exports 的一个引用,因此在模块里边随意更改 exports 的指向会造成未知的错误。所以更推荐开发者采用 module.exports 来暴露模块接口,除非你已经清晰知道这两者的关系。
  • 小程序目前不支持直接引入 node_modules , 开发者需要使用到 node_modules 时候建议拷贝出相关的代码到小程序的目录中,或者使用小程序支持的 npm 功能。
// common.js
function sayHello(name) {
  console.log(`Hello ${name} !`)
}
function sayGoodbye(name) {
  console.log(`Goodbye ${name} !`)
}

module.exports.sayHello = sayHello
exports.sayGoodbye = sayGoodbye

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

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

    

 

(6)API

小程序开发框架提供丰富的微信原生 API,可以方便的调起微信提供的能力,如获取用户信息,本地存储,支付功能等。详细介绍请参考 API 文档

通常,在小程序 API 有以下几种类型:

事件监听 API

我们约定,以 on 开头的 API 用来监听某个事件是否触发,如:wx.onSocketOpenwx.onCompassChange 等。

这类 API 接受一个回调函数作为参数,当事件触发时会调用这个回调函数,并将相关数据以参数形式传入。

代码示例

wx.onCompassChange(function (res) {
  console.log(res.direction)
})

同步 API

我们约定,以 Sync 结尾的 API 都是同步 API, 如 wx.setStorageSyncwx.getSystemInfoSync 等。此外,也有一些其他的同步 API,如 wx.createWorkerwx.getBackgroundAudioManager 等,详情参见 API 文档中的说明。

同步 API 的执行结果可以通过函数返回值直接获取,如果执行出错会抛出异常。

代码示例

try {
  wx.setStorageSync('key', 'value')
} catch (e) {
  console.error(e)
}

异步 API

大多数 API 都是异步 API,如 wx.requestwx.login 等。这类 API 接口通常都接受一个 Object 类型的参数,这个参数都支持按需指定以下字段来接收接口调用结果:

Object 参数说明

参数名 类型 必填 说明
success function 接口调用成功的回调函数
fail function 接口调用失败的回调函数
complete function 接口调用结束的回调函数(调用成功、失败都会执行)
其他 Any - 接口定义的其他参数

回调函数的参数

successfailcomplete 函数调用时会传入一个 Object 类型参数,包含以下字段:

属性 类型 说明
errMsg string 错误信息,如果调用成功返回 ${apiName}:ok
errCode number 错误码,仅部分 API 支持,具体含义请参考对应 API 文档,成功时为 0
其他 Any 接口返回的其他数据

异步 API 的执行结果需要通过 Object 类型的参数中传入的对应回调函数获取。部分异步 API 也会有返回值,可以用来实现更丰富的功能,如 wx.requestwx.connectSocket 等。

代码示例

wx.login({
  success(res) {
    console.log(res.code)
  }
})

 

 

 

 

.

 

转载于:https://www.cnblogs.com/jianxian/p/11101337.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30242907/article/details/99499145

智能推荐

蓝桥杯大赛单片机比赛的心得总结_蓝桥杯单片机备赛心得-程序员宅基地

文章浏览阅读1w次,点赞39次,收藏175次。翻了下以前做过的一些项目和比赛,发现了之前准备比赛的一些注意事项和心得,分享给大家希望大家能够避免错误拿高分。 适当的延时很重要,可以解决一些不正常现象 ds1302读取的时间是BCD码,操作时间时换成10进制操作例:(shi / 16) * 10 + shi % 16**********************************使用串口..._蓝桥杯单片机备赛心得

第十四届蓝桥杯省赛 python b组_第十四届蓝桥杯大赛软件赛省赛 python 大学 b 组-程序员宅基地

文章浏览阅读471次。关于题解请点击每个题目下方链接,否则请等待更新。_第十四届蓝桥杯大赛软件赛省赛 python 大学 b 组

自定义校验注解-程序员宅基地

文章浏览阅读1.5k次。目录问题背景解决方案引入依赖添加自定义注解类接口实现自定义校验器类实现校验工具类问题背景开发过程中,常常需要对某些字段进行校验,每次都去写校验逻辑不仅麻烦,而且不能复用,因此可以使用自定义校验注解进行校验。使用时,只需要在需要添加校验的字段上加上自定义的注解即可。解决方案这里以自定义手机号校验注解为例进行讲解引入依赖 <dependency> <groupId>org.springframework.boot</gr_自定义校验注解

C语言入门 -- 判断回文(2021/2/2)-程序员宅基地

文章浏览阅读720次。判断回文忽略标点空格,判断是否回文回文回文是一个前后拼写相同的字符串。回文的一些例子有:“radar”、“able was i ere i saw elba,”以及,如果忽略空格,“a man a plan a canal panama”。编写一个函数testPalindrome(),如果数组中存储的字符串是回文,则返回1,否则返回0。您应该忽略字符串中字符的大小写、空格和标点符号。用main()函数测试函数。/* Name:programme4.c Author:祁麟 Date:202

OMPL学习--第三篇之源码安装Moveit!和OMPL(Melodic版本)_源码安装moveit,临时扩大内存-程序员宅基地

文章浏览阅读7.2k次,点赞18次,收藏149次。OMPL Moveit! Source install 自定义运动规划算法文章目录1. 引言2. 实现方法2.1 Source install Moveit!2.2 Source install OMPL3.0 测试1. 引言2. 实现方法操作系统:Ubuntu 18.04ROS版本:Melodic2.1 Source install Moveit!卸载moveit!:su..._源码安装moveit,临时扩大内存

怎样和求职者聊天_我如何学会欣赏求职者-程序员宅基地

文章浏览阅读1.3k次。怎样和求职者聊天 被标记为工作漏斗的可能性仍是许多技术领域关注的问题。 这种恐惧通常是不合理的,主要是由于传统的和过时的就业观念扩展到了可能不属于他们的经济体中。 换句话说,不要听父母的职业建议。 在90年代互联网泡沫破灭之初,当我第一次开始招聘软件工程师时,更多高级同事建议我避免浪费时间与求职者交谈。 对于那些需要花费大量时间和金钱来使新员工有效的公司,但后来不久失去他们的公司,那些经常..._怎么跟应聘人员聊天

随便推点

TensorFlow变量管理-tf.get_variable和tf.variable_scope_tf.global_variables csdn-程序员宅基地

文章浏览阅读3.9k次,点赞8次,收藏18次。本文代码可在https://github.com/TimeIvyace/MNIST-TensorFlow.git中下载,程序名为train_improved1.py。当编写程序较长时,文件中定义的函数的输入参数可能会很多,例如神经网络的参数:def inference(input_tensor, avg_class, weights1, biases1, weights2, biases2):当神经_tf.global_variables csdn

想转行网络安全行业,究竟是参加培训班还是靠自学?_网络安全自学还是培训好-程序员宅基地

文章浏览阅读187次。想转行网络安全行业,究竟是参加培训班还是靠自学?_网络安全自学还是培训好

什么是大小端?怎么分辨大小端?-程序员宅基地

文章浏览阅读2.5w次,点赞42次,收藏230次。大小端是针对非单字节数据的存取,比如short型,int型等。大端存储是将数据的高位存储在内存的低地址处,小端存储是将数据的低位存储在内存的低地址处。_大小端

macOS使用phpize安装扩展时报错_macos使用phpize安装扩展时报错。-程序员宅基地

文章浏览阅读182次。macOS使用phpize安装扩展时报错。$ phpizegrep: /usr/include/php/main/php.h: No such file or directorygrep: /usr/include/php/Zend/zend_modules.h: No such file or directorygrep: /usr/include/php/Zend/zend_extensions.h: No such file or directoryConfiguring for:PHP _macos使用phpize安装扩展时报错。

SSM音乐网站的设计与实现-计算机毕设 附源码97245_数据库设计中歌曲和付费之间的联系名称是什么-程序员宅基地

文章浏览阅读1.3k次,点赞26次,收藏37次。前台注册用户的功能如下:注册登录:用户填写个人信息,并验证手机号码进行账户注册,注册成功后方可登录系统。音乐资讯:用户可以在线进行资讯搜索,音乐资讯信息进行查看等。歌曲信息:用户可以在此模块中查找自己喜欢的歌曲信息。维护个人信息:用户因个人信息的变更可以随时修改自己注册信息。歌曲排行榜:用户可以在线查看歌曲排行榜操作。歌曲下载:用户可以进行歌曲下载操作。音乐论坛:用户可以在线进行音乐论坛交流。_数据库设计中歌曲和付费之间的联系名称是什么

android 刷入 windows,安卓技术宅系列之安卓手机刷Windows98-程序员宅基地

文章浏览阅读5.2k次。现在网上什么最火?除了忙的要死的元芳之外恐怕就要数逆天的技术宅了,各种电子产品刷成安卓的操作系统,不论是正常的手机,还是相机,甚至是计算器遥控器等都逃不过技术宅的魔爪,更有甚者在安卓机器上运行了Windows操作系统,这实让安卓系统火了一把。当然这其中有不少都是PS的结果,但是从理论分析只要硬件达标其实不同的硬件是可以运行各种操作系统的,至少在虚拟机的环境下是可以的。现在就让我们一起来当一回技术宅..._csdn安卓手机刷操作系统