zoukankan      html  css  js  c++  java
  • 小程序框架之逻辑层App Service

    小程序开发框架的逻辑层使用 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)
      }
    })

    .

  • 相关阅读:
    20162310 《程序设计与数据结构》课程总结
    实验五数据结构综合应用 20162310
    Dijkstra
    图的深度优先遍历与广度优先遍历以及最小生成树
    课堂练习之链表节点删除与构建堆
    算法复杂度
    构造Huffman以及实现
    索引和查找课堂笔记与解读同伴问题和收获
    课下测试ch17&ch18
    课堂作业之杨辉三角形
  • 原文地址:https://www.cnblogs.com/fightjianxian/p/11101337.html
Copyright © 2011-2022 走看看