js微信监听返回_微信小程序(2)- 框架结构amp;运行环境

一、小程序框架结构

小程序框架分场景获取、逻辑层和视图层

  • 场景获取:场景值是用来描述用户进入小程序的路径,可以在小程序的生命周期onLaunchonShow 里获取。也可以通过wx.getLaunchOptionsSync来获取场景值。详细的场景列表可以在下面文档查看。
微信开放文档​developers.weixin.qq.com
508307e226c4606f245b51225f14fe87.png
  • 逻辑层:先要知道小程序开发框架的逻辑层是基于js引擎来给开发者提供代码运行环境和小程序里特有的功能;逻辑层的意义在于处理数据发送给视图层,进行数据状态变化,同时逻辑层也接受视图层的事件反馈。
    还有一点需要注意,就是小程序的逻辑层不运行在浏览器,所以一些web的一些能力无法使用,比如document、window之类的。在js基础上,小程序又新增了一些功能方法,方便开发
    1. 增加 AppPage 方法,进行程序注册和页面注册。
    2. 增加 getAppgetCurrentPages 方法,分别用来获取 App 实例和当前页面栈。
    3. 提供丰富的 API,如微信用户数据,扫一扫,支付等微信特有能力。
    4. 提供模块化能力,每个页面有独立的作用域逻辑层:注册小程序(小程序创建的时候这边已经注册和绑定,如果项目中不需要特殊处理,不需要改动)
    每个小程序开始需要在app.js里注册和挂在小程序的实例,绑定生命周期回调函数、错误监听和页面不存在监听函数等。整个小程序只能存在一个APP实例,我们可以通过getApp方法获取到全局唯一的 App 实例,获取App上的数据或调用开发者注册在App上的函数。文档参考:
App(Object object) | 微信开放文档​developers.weixin.qq.com

逻辑层:注册页面。

对于小程序中的每个页面,都需要在页面对应的js文件中进行注册,指定页面的初始数据、生命周期回调、事件处理函数等。
简单页面直接用Page来注册页面

Page({data: {text: "This is page data."},onLoad: function(options) {// 页面创建时执行},onShow: function() {// 页面出现在前台时执行},onReady: function() {// 页面首次渲染完毕时执行},onHide: function() {// 页面从前台变为后台时执行},onUnload: function() {// 页面销毁时执行},onPullDownRefresh: function() {// 触发下拉刷新时执行},onReachBottom: function() {// 页面触底时执行},onShareAppMessage: function () {// 页面被用户分享时执行},onPageScroll: function() {// 页面滚动时执行},onResize: function() {// 页面尺寸变化时执行},onTabItemTap(item) {// tab 点击时执行console.log(item.index)console.log(item.pagePath)console.log(item.text)},// 事件响应函数viewTap: function() {this.setData({text: 'Set some data for updating view.'}, function() {// this is setData callback})},// 自由数据customData: {hi: 'MINA'}
})

如果页面比较负责,则需要使用 Component 构造器构造页面,这个就类似VUE,方法都放在methods里。

Component({data: {text: "This is page data."},methods: {onLoad: function(options) {// 页面创建时执行},onPullDownRefresh: function() {// 下拉刷新时执行},// 事件响应函数viewTap: function() {// ...}}
})

在页面中引用behaviors,可以做到多个页面同时共有相同的数据和方法。

// my-behavior.js
module.exports = Behavior({data: {sharedText: 'This is a piece of data shared between pages.'},methods: {sharedMethod: function() {this.data.sharedText === 'This is a piece of data shared between pages.'}}
})
// page-a.js
var myBehavior = require('./my-behavior.js')
Page({behaviors: [myBehavior],onLoad: function() {this.data.sharedText === 'This is a piece of data shared between pages.'}
})

逻辑层:生命周期 page实例的生命周期(现在看懂有点难,后面慢慢理解)

10c3d95108b024bddec602adf9e9e084.png

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

页面栈

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

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

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

路由方式

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

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

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

当前页面路由后页面触发的生命周期(按顺序)AANothing happendABA.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()

Tips:

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

逻辑层:模块化

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

// common.js
function sayHello(name) {console.log(`Hello ${name} !`)
}
function sayGoodbye(name) {console.log(`Goodbye ${name} !`)
}module.exports.sayHello = sayHello
exports.sayGoodbye = sayGoodbye
var common = require('common.js')
Page({helloMINA: function() {common.sayHello('MINA')},goodbyeMINA: function() {common.sayGoodbye('MINA')}
})

文件作用域

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

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

// app.js
App({globalData: 1
})// a.js
// The localValue can only be used in file a.js.
var localValue = 'a'
// Get the app instance.
var 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.
var localValue = 'b'
// If a.js it run before b.js, now the globalData shoule be 2.
console.log(getApp().globalData)

逻辑层:API 后面会有详细提到。

  • 视图层 View
    基本解释:
    框架的视图层由 WXML 与 WXSS 编写,由组件来进行展示。

将逻辑层的数据反应成视图,同时将视图层的事件发送给逻辑层。

WXML(WeiXin Markup language) 用于描述页面的结构。

WXS(WeiXin Script) 是小程序的一套脚本语言,结合 WXML,可以构建出页面的结构。

WXSS(WeiXin Style Sheet) 用于描述页面的样式。

组件(Component)是视图的基本组成单元。[1]

(视图层还有一些细节,想看的可以直接去看官方文档)

二、小程序运行环境

微信小程序运行在多种平台上:iOS(iPhone/iPad)微信客户端、Android 微信客户端、PC 微信客户端、Mac 微信客户端和用于调试的微信开发者工具。

JavaScript 支持情况

运行限制

基于安全考虑,小程序中不支持动态执行 JS 代码,即:

  • 不支持使用 eval 执行 JS 代码
  • 不支持使用 new Function 创建函数
    有个函数支持表,可以去文档查看一下。我就不在这贴了。

小程序运行机制

前台/后台状态

小程序启动后,界面被展示给用户,此时小程序处于前台状态。

当用户点击右上角胶囊按钮关闭小程序,或者按了设备 Home 键离开微信时,小程序并没有完全终止运行,而是进入了后台状态,小程序还可以运行一小段时间。

当用户再次进入微信或再次打开小程序,小程序又会从后台进入前台。但如果用户很久没有再进入小程序,或者系统资源紧张,小程序可能被销毁,即完全终止运行。

小程序启动

这样,小程序启动可以分为两种情况,一种是冷启动,一种是热启动

  • 冷启动:如果用户首次打开,或小程序销毁后被用户再次打开,此时小程序需要重新加载启动,即冷启动。
  • 热启动:如果用户已经打开过某小程序,然后在一定时间内再次打开该小程序,此时小程序并未被销毁,只是从后台状态进入前台状态,这个过程就是热启动。

小程序销毁时机

通常,只有当小程序进入后台一定时间,或者系统资源占用过高,才会被销毁。具体而言包括以下几种情形:

  • 当小程序进入后台,可以维持一小段时间的运行状态,如果这段时间内都未进入前台,小程序会被销毁。
  • 当小程序占用系统资源过高,可能会被系统销毁或被微信客户端主动回收。
    • 在 iOS 上,当微信客户端在一定时间间隔内连续收到系统内存告警时,会根据一定的策略,主动销毁小程序,并提示用户 「运行内存不足,请重新打开该小程序」。具体策略会持续进行调整优化。
    • 建议小程序在必要时使用 wx.onMemoryWarning 监听内存告警事件,进行必要的内存清理。

小程序更新机制

未启动时更新

开发者在管理后台发布新版本的小程序之后,如果某个用户本地有小程序的历史版本,此时打开的可能还是旧版本。微信客户端会有若干个时机去检查本地缓存的小程序有没有更新版本,如果有则会静默更新到新版本。总的来说,开发者在后台发布新版本之后,无法立刻影响到所有现网用户,但最差情况下,也在发布之后 24 小时之内下发新版本信息到用户。用户下次打开时会先更新最新版本再打开。

启动时更新

小程序每次冷启动时,都会检查是否有更新版本,如果发现有新版本,将会异步下载新版本的代码包,并同时用客户端本地的包进行启动,即新版本的小程序需要等下一次冷启动才会应用上。

(PS 这块的机制属于小程序运行时的机制,理解最好,不理解也能写。)[2]

参考

  1. ^项目写的时wxml基本html,不会过多记录,后面会着重讲wxs和component
  2. ^现在先过一下小程序的基本介绍和功能,以及结构理解。方便后面开发。先理解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/507072.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

html中怎样播放本地视频教程,【Axure9基础教程】内联框架如何引入本地音频 视频 HTML PDF等本地文件...

在【在讲解如何插入本地文件之前需要先讲两个概念&#xff0c;相对路径和绝对路径&#xff0c;了解了这两个概览后&#xff0c;才能顺利的插入本地文件并识别成功绝对路径和相对路径是什么?相对路径&#xff1a;相对路径就是相对于当前文件的路径&#xff0c;以引用文件之网页…

oralce load的时候使用触发器会导致load慢吗_你真的了解性能压测中的SLA吗?

作者简介&#xff1a;襄玲(花名)&#xff0c;阿里巴巴技术专家&#xff0c;PTS 研发&#xff0c;近期主导整理和推动云时代性能压测的思想和标准,云计算性能测试国标项目组成员&#xff0c;内部稳定性保障系统之预热系统负责人。本文是《Performance Test Together》(简称PTT)系…

arduino 停止程序_极路由1S OpenWrt开机自启程序及串口调试

如何给openwrt添加启动项&#xff1f;首先在/etc/init.d中创建一个文件&#xff0c;在CRT终端中直接用vi命令即可&#xff0c;自行创建startCamera文件&#xff0c;如下图所示。vi编辑器中输入下图所示内容&#xff0c;START50表示系统启动的优先顺序&#xff0c;数字越小越优先…

隐藏鼠标指针_Mac鼠标光标消失怎么办?苹果电脑鼠标指针不显示的解决方法

在小编使用mac电脑的过程中发现&#xff0c;鼠标光标会偶尔在Mac上消失。这种情况完全是随机的&#xff0c;任何时候都有可能发生。经过几次之后小编发现&#xff0c;当使用诸如Photoshop之类的大型软件并连接多个显示器时&#xff0c;鼠标光标可能消失的几率最大。或者使用Saf…

realtek网卡mac硬改工具_七彩虹联合Realtek发布粉色固态硬盘 首发评测

七彩虹是PC行业领先的科技企业&#xff0c;其中在板卡领域是大陆第一的品牌&#xff0c;而在存储领域也常常被行业称为四大金刚之一。小螃蟹瑞昱(Realtek)是领先的专业IC设计公司&#xff0c;其中广为大家所认知的是网卡芯片、声卡芯片——这两个领域几乎是霸主地位。同时在WiF…

微型计算机继电器控制,可编程控制器与微机及继电器控制的区别 -解决方案-华强电子网...

1. PC与MC控制的区别简而言之&#xff0c;MC是通用的专用机&#xff0c;而PC则是专用的通用机。从微型计算机的应用范围来说&#xff0c;MC是通用机&#xff0c;而PC是专用机。微型计算机是在以往计算机与大规模集成电路的基础上发展起来的&#xff0c;它最大特征是运算速度快&…

计算机与自动化专业有哪些学校,全国自动化专业大学排名

自动化专业大学排名已经公布啦&#xff0c;下面由出国留学网小编为你精心准备了“2020自动化专业大学排名公布”&#xff0c;持续关注本站将可以持续获取更多的考试资讯!2020自动化专业大学排名公布自动化专业最好的大学有哪几所&#xff0c;中国哪些本科大学自动化专业实力最强…

用友无法打开计算机的ufnet服务,服务器安装完毕登陆正常,但是客户端安装完毕,重启以后,用友通无法正常启动,手工在服务里面启动,提示‘服务无法启动或依存的标记被删除’...

问题现象&#xff1a;服务器安装完毕登陆正常&#xff0c;但是客户端安装完毕&#xff0c;重启以后&#xff0c;用友用友T3服务无法正常启动&#xff0c;手工在服务里面启动&#xff0c;提示‘服务无法启动或依存的标记被删除’问题模块&#xff1a;系统环境关键字&#xff1a;…

高中发表在论文计算机方面,高中计算机教学论文

高中计算机教学论文引导语&#xff1a;人们的生活已经离不开计算机&#xff0c;计算机已走进千家万户&#xff0c;由此可见学好计算机是一件非常重要的事情&#xff0c;那么相关的高职计算机教学论文要怎么写呢&#xff1f;接下来是小编为你带来收集整理的文章&#xff0c;欢迎…

计算机控制lc72131,lc72131(1)

----------------------- Page 1-----------------------LC72131锁相环频率合成器概述与特点LC72131 是一种锁相环频率合成器。该电路的特点如下&#xff1a;1.高速可编程分频器FMIN&#xff1a; 10--160MHz……………双模式预分频(内置二分频器)AMIN: 2--40MHz ……………双模…

做手游的计算机配置要求,原神pc配置要求高吗 最低什么配置能流畅运行​

从最新消息来看&#xff0c;《原神》将于9月15日开启PC版技术开放性测试&#xff0c;是面向所有玩家的&#xff0c;不删档&#xff0c;本质上你就可以将其理解为正式上线了。原神是一款多平台、多数据互通的游戏。但显而易见的是PC版的原神拥有更高的画质和游戏性能&#xff0c…

HTML入门小站,Phaser

入门教程&#xff0c;我可不会讲什么概念&#xff0c;我只会讲一个入门例子&#xff0c;通过这个例子&#xff0c;你就知道phaser有多么强大&#xff0c;而照着这个例子做&#xff0c;你就能知道怎么使用phaser了。需要说明的是&#xff0c;这个就是phaser官方的一个入门的案例…

h2 可视化界面能添加 添加表_Excel只能做表格?那是你不会用!10分钟做出高大上可视化图...

很多公司都要求员工熟练的掌握Excel。But&#xff0c;绝大多数人所谓的熟练使用Excel&#xff0c;估计也只会一些简单的表格和知道加减乘除、求和吧&#xff01;再难一点&#xff0c;估计就真的把自己难倒了。讲真&#xff0c;Excel还是很牛的&#xff0c;只是你不会&#xff0…

戴尔电脑怎么安装一级计算机,手把手教你戴尔笔记本电脑重装系统教程

随着生活质量的提高&#xff0c;现今基本上人人都拥有一台专属于自己的笔记本电脑。但要是说起笔记本&#xff0c;那dell笔记本可是一个不错的品牌呢?所以小编今天要给大家说的知识点就是关于Dell笔记本怎么重装系统的内容。有兴趣的可以学起来哦&#xff01;最近小编发现有小…

量子计算机通用程序,量子计算机程序具有“通用性”?基于拓扑量子纠错码的量子计算机...

原标题&#xff1a;量子计算机程序具有“通用性”&#xff1f;基于拓扑量子纠错码的量子计算机不管量子计算机的内部是由什么组成&#xff0c;量子计算机的快速计算都可以归结为应用于量子比特的简单指令序列&#xff0c;即量子计算机内部的基本信息单位。无论这台计算机是由离…

指纹机和计算机无法连接,考勤机怎么连接到电脑?考勤机连接电脑之后操作指南!...

考勤机&#xff0c;主要是用来将员工的出勤基本情况记录以及统计下来的机器。同时能够根据员工的工作上下班时间&#xff0c;详细地统计出加班时间、早退、迟到、旷工等出勤的情况。我们在统计具体的数据情况时候&#xff0c;就需要将考勤机与电脑进行联机&#xff0c;这样更加…

canvas转盘-拯救选择困难

转盘-拯救选择困难效果图简介代码效果图 简介 每到饭点就纠结吃什么&#xff0c;不如直接roll点。 在词条框中输入选项&#xff0c;选项用逗号&#xff08;中英都可&#xff09;隔开。点击设置词条&#xff0c;会根据词条&#xff08;没有输入则获取代码中的默认词条&#xf…

ue4中在物体上加ui_UE4 物体位置同步相关源码分析浅谈

前言多图, 不想在源代码写注释, 不想贴代码块, 看的不清楚版本4.21混4.22, 区别不大文章属于旧有文章搬运, 之前在csdn上面2019.10.27修改一版物体位置信息同步, 或者说物体的移动同步, 是一个很大的坑, 从个人目前魔改UE4位置同步后, 感觉至少要考虑以下几点位置信息的数据结构…

Prime算法生成迷宫

prime迷宫生成结果展示算法解析实现代码结果展示 算法解析 参考链接 Prime迷宫生成算法的原理&#xff1a; (1)初始地图所有位置均设为墙 (2)任意插入一个墙体进墙队列 (3)判断此时墙体是否可以设置为路(判断依据在于上下左右四个位置是否只有一个位置是路) (4)若设置为路&…

wifi密码公式计算机,求一些高数公式,做wifi密码用?

满意答案thyk72832018.06.08采纳率&#xff1a;55% 等级&#xff1a;13已帮助&#xff1a;8612人1)∫kdxkxc2)∫x^udx(x^(u1))/(u c3)∫1/xdxln|x|c4) ∫a^xdx(a^x)/lnac5)∫e^xdxe^xc6)∫sinxdx-cosxc7)∫cosxdxsinxc8)∫1/(cosx)^2dxtanxc9)∫1/(sinx)^2dx-cotxc10)∫1/√…