tencent cloud

文档反馈

逻辑层说明

最后更新时间:2024-03-05 14:37:51

    逻辑层 App Service

    小程序开发框架的逻辑层使用 JavaScript 引擎为小程序提供开发者 JavaScript 代码的运行环境以及TMF小程序的特有功能。
    逻辑层将数据进行处理后发送给视图层,同时接受视图层的事件反馈。
    开发者写的所有代码最终将会打包成一份 JavaScript 文件,并在小程序启动的时候运行,直到小程序销毁。这一行为类似 ServiceWorker,所以逻辑层也称之为 App Service。
    在 JavaScript 的基础上,我们增加了一些功能,以方便小程序的开发:
    增加 App 和 Page 方法,进行程序和页面的注册。
    增加 getApp 和 getCurrentPages 方法,分别用来获取 App 实例和当前页面栈。
    提供丰富的 API,如TMF用户数据,扫一扫,支付等TMF特有能力。
    每个页面有独立的 作用域,并提供 模块化 能力。
    注意:
    小程序框架的逻辑层并非运行在浏览器中,因此 JavaScript 在 web 中一些能力都无法使用,如 windowdocument 等。

    注册小程序 App

    App(Object)

    App()函数用来注册一个小程序。接受一个Object参数,其指定小程序的生命周期回调等。
    App() 必须在app.js中调用,必须调用且只能调用一次。不然会出现无法预期的后果。
    Object 参数说明:
    属性
    类型
    描述
    触发时机
    onLaunch
    function
    生命周期回调—监听小程序初始化
    小程序初始化完成时(全局只触发一次)
    onShow
    function
    生命周期回调—监听小程序初显示
    小程序启动,或从后台进入前台显示时
    onHide
    function
    生命周期回调—监听小程序初隐藏
    小程序从前台进入后台时
    onError
    function
    错误监听函数
    小程序发生脚本错误,或者 api 调用失败时触发,会带上错误信息
    function
    页面不存在监听函数
    小程序要打开的页面不存在时触发,会带上页面信息回调该函数
    其他
    any
    开发者可以添加任意的函数或数据到 Object 参数中,用 this 可以访问
    -
    前台、后台定义:当用户单击右上角关闭,或者按了设备 Home 键离开宿主 App,小程序并没有直接销毁,而是进入了后台;当再次进入宿主 App 或再次打开小程序,又会从后台进入前台。
    说明:
    只有当小程序进入后台一定时间,或者系统资源占用过高,才会被真正的销毁。
    关闭小程序: 当用户从扫一扫、转发等入口(场景值为1007, 1008, 1011, 1025)进入小程序,且没有置顶小程序的情况下退出,小程序会被销毁。
    示例代码:
    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)

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

    onShow(Object)

    小程序启动,或从后台进入前台显示时触发。

    onHide()

    小程序从前台进入后台时触发。

    onError(String error)

    小程序发生脚本错误或 API 调用报错时触发。也可以使用 onError 绑定监听。
    参数及说明:与 onError 一致

    onPageNotFound(Object)

    小程序要打开的页面不存在时触发。
    示例代码:
    App({
    onPageNotFound(res) {
    wx.redirectTo({
    url: 'pages/...'
    }) // 如果是 tabbar 页面,请使用 wx.switchTab
    }
    })

    getApp(Object)

    全局的 getApp() 函数可以用来获取到小程序 App实例。
    Object 参数说明:
    字段
    类型
    说明
    最低版本
    allowDefault
    boolean
    App 未定义时返回默认实现。当 App 被调用时,默认实现中定义的属性会被覆盖合并到 App 中。
    -
    示例代码:
    // other.js
    const appInstance = getApp()
    console.log(appInstance.globalData) // I am global data
    注意:
    不要在定义于 App() 内的函数中调用 getApp() ,使用 this 就可以拿到 app 实例。
    通过 getApp() 获取实例之后,不要私自调用生命周期函数。

    场景值

    获取场景值

    当前支持的场景值有:
    对于小程序,可以在 App的 onLaunch和 onShow,或 getLaunchOptionsSync 中获取上述场景值。

    返回来源信息的场景

    部分场景值下还可以获取来源应用、公众号或小程序的 appId。
    场景值
    场景
    appId含义
    1020
    公众号 profile 页相关小程序列表
    来源公众号
    1035
    公众号自定义菜单
    来源公众号
    1036
    App 分享消息卡片
    来源 App
    1037
    小程序打开小程序
    来源小程序
    1038
    从另一个小程序返回
    来源小程序
    1043
    公众号模板消息
    来源公众号
    说明:
    由于 Android 系统限制,目前还无法获取到按 Home 键退出到桌面,然后从桌面再次进小程序的场景值,对于这种情况,会保留上一次的场景值。

    注册页面

    注册页面相关操作,可参见 注册页面

    页面路由

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

    页面栈

    框架以栈的形式维护了当前的所有页面。 当发生路由切换的时候,页面栈的表现如下:
    路由方式
    页面栈表现
    初始化
    新页面入栈
    打开新页面
    新页面入栈
    页面重定向
    当前页面入栈,新页面入栈
    页面返回
    页面不断出栈,直到目标返回页
    Tab切换
    页面全部出栈,只留下新的Tab页面
    重加载
    页面全部出栈,只留下新的页面

    getCurrentPages()

    getCurrentPages() 函数用于获取当前页面栈的实例,以数组形式按栈的顺序给出,第一个元素为首页,最后一个元素为当前页面。
    注意:
    不要尝试修改页面栈,会导致路由以及页面状态错误。
    不要在 App.onLaunch 的时候调用 getCurrentPages(),此时 page 还没有生成。

    路由方式

    对于路由的触发方式以及页面生命周期函数如下:
    路由方式
    触发时机
    路由前页面
    路由后页面
    初始化
    小程序打开的第一个页面
    -
    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()
    说明:
    navigateTo, redirectTo 只能打开非 tabBar 页面。
    switchTab 只能打开 tabBar 页面。
    reLaunch 可以打开任意页面。
    页面底部的 tabBar 由页面决定,即只要是定义为 tabBar 的页面,底部都有 tabBar。
    调用页面路由带的参数可以在目标页面的 onLoad 中获取。

    文件作用域

    在 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 时候建议拷贝出相关的代码到小程序的目录中或者使用小程序支持的 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(path) 将公共代码引入
    const common = require('common.js')
    Page({
    helloMINA() {
    common.sayHello('MINA')
    },
    goodbyeMINA() {
    common.sayGoodbye('MINA')
    }
    })
    说明:
    require 暂时不支持绝对路径。

    API

    事件监听

    约定使用以“on”开头的 API 来监听事件是否触发,例如:wx.onCompassChange 等。
    这类 API 接受一个回调函数作为参数,当事件触发时会调用这个回调函数,并将相关数据以参数形式传入。
    代码示例:
    wx.onCompassChange(function (res) {
    console.log(res.direction)
    })

    同步

    我们约定,以 Sync 结尾的 API 都是同步 API, 如 wx.setStorageSync,wx.getSystemInfoSync 等。此外,也有一些其他的同步 API,详情参见 API 文档中的相关说明。
    同步 API 的执行结果可以通过函数返回值直接获取,如果执行出错会抛出异常。
    代码示例:
    try {
    wx.setStorageSync('key', 'value')
    } catch (e) {
    console.error(e)
    }

    异步

    大多数 API 都是异步 API,如 wx.request,wx.login 等。这类 API 接口通常都接受一个 Object 类型的参数,这个参数都支持按需指定以下字段来接收接口调用结果:
    Object 参数说明
    参数名
    类型
    必填
    说明
    success
    function
    接口调用成功的回调函数
    fail
    function
    接口调用成功的回调函数
    complete
    function
    接口调用结束的回调函数(调用成功、失败都会执行)
    其他
    any
    -
    接口定义的其他参数
    回调函数的参数
    successfailcomplete 函数调用时会传入一个 Object 类型参数,包含以下字段:
    属性
    类型
    说明
    errMsg
    string
    错误信息,如果调用成功返回 ${apiName}:ok
    errCode
    number
    错误码,仅部分 API 支持,具体含义请参考对应 API 文档,成功时为 0。
    其他
    any
    接口返回的其他数据
    代码示例:
    wx.login({
    success(res) {
    console.log(res.code)
    }
    })

    WXS

    WXS 相关操作可参见:WXS 详情
    联系我们

    联系我们,为您的业务提供专属服务。

    技术支持

    如果你想寻求进一步的帮助,通过工单与我们进行联络。我们提供7x24的工单服务。

    7x24 电话支持