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)系…

json在html中怎么遍历list,怎么对Json对象进行遍历呢?

首先, 既然你的classlist-group-item;则表示他们就是被遍历出来的. Ps: 不是遍历出来的就不叫list了.json:{name1: "1",name2: "2",name3: "3",name4: "4"}js:var objName {name1: 名称1, name2: 名称2, name3: 名称3, name4: 名称4}…

comps电磁场模拟软件_什么样配置的电脑可以适合用于电磁仿真?

好久不关注PC机了&#xff0c;很多认识还停留在前年(2014年)。。。AMD什么的就别想了。。。第一个问题&#xff1a;公司还是个人&#xff1f;公司问老板&#xff0c;首选Xeon&#xff0c;只为了稳定。我猜题主应该是个人用吧&#xff1f;或者在求导师买机器&#xff1f;那就只有…

计算机四级软件工程知识点,计算机四级考试题库及搜题软件,送一份备考指南给大家!...

原标题&#xff1a;计算机四级考试题库及搜题软件&#xff0c;送一份备考指南给大家&#xff01;大家都知道&#xff0c;英语与计算机考试都是我们读书生涯中很常见的考试。其计算机四级考试就是全国计算机等级水平考试中的一中。计算机四级是针对计算机的熟练以及掌握程度进行…

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

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

浙江省工程师职称英语和计算机考试报名,浙江省工程师职称英语免考条件

根据人事部《关于完善职称外语考试有关问题的通知》(国人部发〔2007〕37号)精神&#xff0c;并结合我省实际&#xff0c;现就职称外语等级考试有关问题通知如下&#xff1a;一、申报专业技术资格应参加全国职称外语相应等级考试。申报正高级专业技术资格的人员统一参加A级考试&…

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

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

商用计算机idc市场排名,IDC 2019 年中国 PC 市场十大预测:出货量约 5060 万台

12 月 27 日&#xff0c;IDC 发布 2019 年中国 PC 市场十大预测。IDC 指出&#xff0c;2018 年全年中国 PC 市场预计最终销售为 5200 万台左右&#xff0c;下滑了 3.4%。2019 年中国 PC 市场会处于一种习惯性艰难期&#xff0c;但是市场也不乏一些重要的机会点。IDC 预测&#…

easyexcel 列头合并_Easyexcel使用文档及动态列的实现

Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存&#xff0c;poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题&#xff0c;但POI还是有一些缺陷&#xff0c;比如07版Excel解压缩以及解压后存储都是在内存中完成的…

财会专用计算机,一种财会专用计算机的制作方法

技术特征&#xff1a;1.一种财会专用计算机&#xff0c;包括计算机本体(3)&#xff0c;其特征在于&#xff0c;所述计算机本体(3)的顶部固定安装有账本板(2)&#xff0c;所述账本板(2)的中部对称安装有账本夹(1)&#xff0c;所述计算机本体(3)内置有无线信号接收器(7)&#xff…

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

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

计算机基础及应用笔试,计算机基础及应用测试笔试题

计算机基础及应用测试笔试题站点&#xff1a;专业&#xff1a;学号&#xff1a;一、选择题1.下面文件扩展名是不可以直接运行的是&#xff1a;A、.exeB、.doc、C、.com2.计算机将数据暂存在中等待处理。A、内存B、硬盘C、主板3.在CPU中&#xff0c;执行加减等算术运算操作以及比…

vue 修改模板{{}}标签_vue-admin-template模板添加tagsview

参考&#xff1a;一、从vue-element-admin复制文件&#xff1a;vue-admin-template\src\layout\components\TagsView 文件夹vue-admin-template\src\store\modules\tagsView.js#vue-admin-template\static 文件夹#vue-admin-template\src\lang 文件夹#vue-admin-template\src\…

python中locals函数_Python神奇的内置函数locals的实例讲解

摘要本文我们介绍神奇的locals函数&#xff0c;包括动态创建变量和动态访问变量&#xff0c;以及一个应用场景。相同属性不相邻问题需求&#xff1a;有两个list&#xff0c;分别为list1和list2。list1中有n个对象&#xff0c;每个对象有5个属性&#xff0c;其中一个属性是tid&a…

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

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

vue点击按钮上传图片_关于javascript:Vue-点击按钮提交表单

我有一个组件&#xff0c;用户可以在其中上传图像&#xff0c;我还想添加一个删除图像的功能。 我添加了一个按钮&#xff0c;该按钮可删除当前图像&#xff0c;但是它的问题在于表单也正在提交&#xff0c;因此我想避免这种情况。 我只需要删除当前图像(如果存在)。 这是脚本&…

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

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

黑苹果uhd630黑屏_求助各位图吧大佬一个黑苹果问题(黑苹果吧发帖得四级),目前使...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼以下是换回auto重启之后系统给的报错信息&#xff1a;panic(cpu 5 caller 0xffffff7f9fc4272f): assertmsg/Library/Caches/com.apple.xbs/Sources/ GPUDriversIntel/GPUDriversIntel-14.7.8/IONDRV/CFL/AppleIntelFramebuffer/ 网…

南京理工大学计算机学院教授严捍,2019年7月1日学术报告二则(宋巍 教授,南京理工大学;张鹏程 副教授,河海大学)...

报告题目1&#xff1a;过程分析与挖掘报告时间&#xff1a;2019年7月1日(周一)上午9:30报告地点&#xff1a;计算机学院E202报告人&#xff1a;宋巍报告人单位&#xff1a;南京理工大学报告人简介&#xff1a;宋巍&#xff0c;南京理工大学计算机科学与工程学院教授、博士生导师…